Operator pengujian jenis dan ekspresi transmisi - is
, , as
typeof
dan transmisi
Operator dan ekspresi ini melakukan pemeriksaan jenis atau konversi jenis. Operator is
memeriksa apakah jenis run-time ekspresi kompatibel dengan jenis tertentu. Operator as
secara eksplisit mengonversi ekspresi ke jenis tertentu jika jenis run-time-nya kompatibel dengan jenis tersebut. Ekspresi cast melakukan konversi eksplisit ke jenis target. Operator typeof
mendapatkan instans System.Type untuk jenis.
operator is
Operator is
memeriksa apakah jenis run-time dari sebuah ekspresi kompatibel dengan jenis yang diberikan. Operator is
juga menguji hasil ekspresi terhadap pola.
Ekspresi dengan operator type-testing is
memiliki bentuk berikut
E is T
E
merupakan ekspresi yang mengembalikan sebuah nilai dan T
merupakan nama jenis atau parameter jenis. E
tidak boleh berupa metode anonim atau ekspresi lambda.
Operator is
memunculkan true
ketika hasil ekspresi bukan null dan salah satu kondisi berikut ini benar:
Jenis run-time dari hasil ekspresi adalah
T
.Jenis run-time dari hasil ekspresi berasal dari jenis
T
, mengimplementasikan antarmukaT
, atau konversi referensi implisit lainya yang sudah ada darinya keT
.Jenis run-time dari hasil ekspresi adalah jenis nilai yang dapat diubah ke null dengan jenis dasar
T
dan Nullable<T>.HasValue adalahtrue
.Konversi boxing atau unboxing sudah ada dari jenis run-time hasil ekspresi ke tipe
T
.
Operator is
tidak mempertimbangkan konversi yang ditentukan pengguna.
Contoh berikut menunjukkan bahwa operator is
mengembalikan true
jika jenis run-time hasil ekspresi berasal dari jenis yang diberikan, yaitu, adanya konversi referensi antara jenis-jenis:
public class Base { }
public class Derived : Base { }
public static class IsOperatorExample
{
public static void Main()
{
object b = new Base();
Console.WriteLine(b is Base); // output: True
Console.WriteLine(b is Derived); // output: False
object d = new Derived();
Console.WriteLine(d is Base); // output: True
Console.WriteLine(d is Derived); // output: True
}
}
Contoh berikutnya menunjukkan bahwa operator is
memperhitungkan konversi boxing dan unboxing, tetapi tidak mempertimbangkan konversi numerik:
int i = 27;
Console.WriteLine(i is System.IFormattable); // output: True
object iBoxed = i;
Console.WriteLine(iBoxed is int); // output: True
Console.WriteLine(iBoxed is long); // output: False
Untuk informasi tentang konversi C#, lihat bab Konversi pada Spesifikasi bahasa C#.
Type testing dengan pencocokan pola
Operator is
juga menguji hasil ekspresi terhadap pola. Contoh berikut menunjukkan cara menggunakan pola deklarasi untuk memeriksa jenis run-time ekspresi:
int i = 23;
object iBoxed = i;
int? jNullable = 7;
if (iBoxed is int a && jNullable is int b)
{
Console.WriteLine(a + b); // output 30
}
Untuk informasi tentang pola yang didukung, lihat Pola.
operator as
Operator as
secara eksplisit mengonversi hasil sebuah ekspresi menjadi referensi tertentu atau jenis nilai yang dapat diubah ke null. Jika konversi tersebut tidak memungkinkan, operator as
akan mengembalikan null
. Tidak seperti ekspresi konversi eksplisit, operator as
tidak pernah memunculkan pengecualian.
Ekspresi bentuknya
E as T
E
adalah ekspresi yang mengembalikan nilai dan T
adalah nama jenis atau parameter jenis, mengeluarkan hasil yang sama dengan
E is T ? (T)(E) : (T)null
kecuali E
hanya dievaluasi sekali.
Operator as
hanya mempertimbangkan konversi referensi, boxing, unboxing, dan konversi yang dapat diubah ke null. Anda tidak dapat menggunakan operator as
untuk melakukan konversi yang ditentukan pengguna. Untuk melakukannya, gunakan ekspresi konversi eksplisit.
Contoh berikut menunjukkan penggunaan operator as
:
IEnumerable<int> numbers = new List<int>(){10, 20, 30};
IList<int> indexable = numbers as IList<int>;
if (indexable != null)
{
Console.WriteLine(indexable[0] + indexable[indexable.Count - 1]); // output: 40
}
Catatan
Seperti yang ditunjukkan contoh sebelumnya, Anda perlu membandingkan hasil ekspresi as
dengan null
untuk memeriksa apakah konversi berhasil. Anda dapat menggunakan operator is baik untuk menguji apakah konversi berhasil dan, jika berhasil, tetapkan hasilnya ke variabel baru.
Ekspresi konversi eksplisit
Ekspresi konversi eksplisit dari bentuk (T)E
melakukan konversi eksplisit dari hasil ekspresi E
ke jenis T
. Jika tidak ada konversi eksplisit dari jenis E
ke jenis T
, kesalahan waktu kompilasi terjadi. Pada durasi, konversi eksplisit mungkin tidak berhasil dan ekspresi konversi eksplisit mungkin memunculkan pengecualian.
Contoh berikut menunjukkan konversi numerik dan referensi eksplisit:
double x = 1234.7;
int a = (int)x;
Console.WriteLine(a); // output: 1234
int[] ints = [10, 20, 30];
IEnumerable<int> numbers = ints;
IList<int> list = (IList<int>)numbers;
Console.WriteLine(list.Count); // output: 3
Console.WriteLine(list[1]); // output: 20
Untuk informasi tentang konversi eksplisit yang didukung, lihat bagian Konversi eksplisit dari Spesifikasi bahasa C#. Untuk informasi tentang cara menentukan konversi jenis eksplisit atau implisit kustom, lihat Operator konversi yang ditentukan pengguna.
Penggunaan lainnya dari ()
Anda juga dapat menggunakan tanda kurung untuk memanggil metode atau menggunakan delegasi.
Penggunaan tanda kurung lainnya adalah untuk menyesuaikan urutan dengan tujuan melakukan evaluasi operasi dalam sebuah ekspresi. Untuk informasi selengkapnya, lihat Operator C#.
Operator typeof
Operator typeof
mendapatkan instans System.Type untuk suatu jenis. Argumen ke operator typeof
harus berupa nama jenis atau parameter jenis, seperti yang ditunjukkan contoh berikut:
void PrintType<T>() => Console.WriteLine(typeof(T));
Console.WriteLine(typeof(List<string>));
PrintType<int>();
PrintType<System.Int32>();
PrintType<Dictionary<int, char>>();
// Output:
// System.Collections.Generic.List`1[System.String]
// System.Int32
// System.Int32
// System.Collections.Generic.Dictionary`2[System.Int32,System.Char]
Argumen tidak boleh berupa jenis yang memerlukan anotasi metadata. Contohnya termasuk jenis berikut:
dynamic
string?
(atau jenis referensi apa pun yang dapat diubah ke null)
Jenis ini tidak diwakili secara langsung dalam metadata. Jenis ini mencakup atribut yang menjelaskan jenis dasar. Dalam kedua kasus, Anda dapat menggunakan jenis yang mendasarinya. Daripada dynamic
, Anda dapat menggunakan object
. Daripada string?
, Anda dapat menggunakan string
.
Anda juga dapat menggunakan operator typeof
dengan jenis generik yang tidak terikat. Nama jenis generik yang tidak terikat harus berisi jumlah koma yang sesuai, yaitu kurang dari jumlah parameter jenis. Contoh berikut menunjukkan penggunaan operator typeof
dengan jenis generik yang tidak terikat:
Console.WriteLine(typeof(Dictionary<,>));
// Output:
// System.Collections.Generic.Dictionary`2[TKey,TValue]
Ekspresi tidak dapat menjadi argumen operator typeof
. Untuk mendapatkan instans System.Type pada jenis run-time hasil ekspresi, gunakan metode Object.GetType.
Type testing dengan operator typeof
Gunakan operator typeof
untuk memeriksa apakah jenis run-time hasil ekspresi sama persis dengan jenis yang diberikan. Contoh berikut menunjukkan perbedaan antara pemeriksaan jenis yang dilakukan dengan operator typeof
dan operator is:
public class Animal { }
public class Giraffe : Animal { }
public static class TypeOfExample
{
public static void Main()
{
object b = new Giraffe();
Console.WriteLine(b is Animal); // output: True
Console.WriteLine(b.GetType() == typeof(Animal)); // output: False
Console.WriteLine(b is Giraffe); // output: True
Console.WriteLine(b.GetType() == typeof(Giraffe)); // output: True
}
}
Kelebihan beban operator
Operator is
, as
, dan typeof
tidak dapat kelebihan beban.
Jenis yang ditentukan pengguna tidak dapat membebani operator ()
secara berlebihan, tetapi dapat menentukan konversi jenis kustom yang dapat dilakukan oleh ekspresi konversi eksplisit. Untuk informasi selengkapnya, lihat Operator konversi yang ditentukan pengguna.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#: