Bagikan melalui


Operator pengujian tipe dan ekspresi cast - is, as, typeof, dan cast.

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.

Referensi bahasa C# mendokumentasikan versi bahasa C# yang paling baru dirilis. Ini juga berisi dokumentasi awal untuk fitur dalam pratinjau publik untuk rilis bahasa yang akan datang.

Dokumentasi mengidentifikasi fitur apa pun yang pertama kali diperkenalkan dalam tiga versi terakhir bahasa atau dalam pratinjau publik saat ini.

Petunjuk / Saran

Untuk menemukan kapan fitur pertama kali diperkenalkan di C#, lihat artikel tentang riwayat versi bahasa C#.

Si 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

Dimana E adalah ekspresi yang mengembalikan nilai dan T adalah 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 memiliki konversi identitas ke T.

  • Jenis run-time dari hasil ekspresi berasal dari jenis T, mengimplementasikan antarmuka T, atau konversi referensi implisit lainya yang sudah ada darinya ke T. Kondisi ini mencakup hubungan warisan dan implementasi antarmuka.

  • Jenis run-time dari hasil ekspresi adalah jenis nilai yang dapat diubah ke null dengan jenis dasar T dan Nullable<T>.HasValue adalah true.

  • Konversi pengkotakan atau pembongkaran ada dari jenis waktu-nyata hasil ekspresi ke tipe T saat ekspresi bukan merupakan instans dari ref struct.

Operator is tidak mempertimbangkan konversi yang ditentukan pengguna atau konversi rentang implisit.

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.

Si Operator as

as Gunakan operator untuk mengonversi hasil ekspresi secara eksplisit ke 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

Di mana E adalah ekspresi yang mengembalikan nilai dan T merupakan nama parameter jenis atau jenis, menghasilkan hasil yang sama dengan

E is T ? (T)(E) : (T)null

Kecuali bahwa 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 melakukan konversi yang ditentukan pengguna, gunakan ekspresi cast.

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 as ekspresi dengan null untuk memeriksa apakah konversi berhasil. Anda dapat menggunakan is operator untuk menguji apakah konversi berhasil dan, jika berhasil, tetapkan hasilnya ke variabel baru.

Ekspresi konversi eksplisit

Ekspresi cast formulir (T)E secara eksplisit mengonversi hasil ekspresi E menjadi jenis T. Jika tidak ada konversi eksplisit dari jenis ke jenis ET, pengkompilasi mengeluarkan kesalahan. 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 lain tanda kurung adalah menyesuaikan urutan di mana C# mengevaluasi operasi dalam ekspresi. Untuk informasi selengkapnya, lihat Operator C#.

Si Operator typeof

Operator typeof mendapatkan instans System.Type untuk 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. Contoh jenis ini mencakup 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. Alih-alih dynamic, gunakan object. Alih-alih string?, gunakan 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 menggunakan typeof operator dan is operator:

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

Anda tidak dapat membebani isoperator , as, dan typeof berlebih.

Jenis yang ditentukan pengguna tidak dapat membebani () operator secara berlebihan, tetapi dapat menentukan konversi jenis kustom yang dilakukan ekspresi transmisi. Untuk informasi selengkapnya, lihat Operator konversi yang ditentukan pengguna.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:

Lihat juga