Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Dalam C#, kovariansi dan kontravariansi memungkinkan konversi referensi implisit untuk jenis array, jenis delegasi, dan argumen jenis generik. Kovariansi mempertahankan kompatibilitas penugasan dan kontravariansi membalikkannya.
Kode berikut menunjukkan perbedaan antara kompatibilitas penugasan, kovarians, dan kontravariansi.
// Assignment compatibility.
string str = "test";
// An object of a more derived type is assigned to an object of a less derived type.
object obj = str;
// Covariance.
IEnumerable<string> strings = new List<string>();
// An object that is instantiated with a more derived type argument
// is assigned to an object instantiated with a less derived type argument.
// Assignment compatibility is preserved.
IEnumerable<object> objects = strings;
// Contravariance.
// Assume that the following method is in the class:
static void SetObject(object o) { }
Action<object> actObject = SetObject;
// An object that is instantiated with a less derived type argument
// is assigned to an object instantiated with a more derived type argument.
// Assignment compatibility is reversed.
Action<string> actString = actObject;
Kovarians untuk array memungkinkan konversi implisit dari array tipe yang lebih spesifik ke array tipe yang lebih umum. Tetapi operasi ini tidak aman secara tipe, seperti yang ditunjukkan dalam contoh kode berikut.
object[] array = new String[10];
// The following statement produces a run-time exception.
// array[0] = 10;
Dukungan kovariansi dan kontravariansi untuk grup metode memungkinkan pencocokan tanda tangan metode dengan jenis delegasi. Ini memungkinkan Anda menetapkan untuk mendelegasikan tidak hanya metode yang memiliki tanda tangan yang cocok, tetapi juga metode yang mengembalikan lebih banyak jenis turunan (kovariansi) atau yang menerima parameter yang memiliki jenis yang kurang diturunkan (kontravariansi) daripada yang ditentukan oleh jenis delegasi. Untuk informasi selengkapnya, lihat Varians di Delegasi (C#) dan Menggunakan Varians di Delegasi (C#).
Contoh kode berikut menunjukkan dukungan kovarians dan kontravariansi untuk grup metode.
static object GetObject() { return null; }
static void SetObject(object obj) { }
static string GetString() { return ""; }
static void SetString(string str) { }
static void Test()
{
// Covariance. A delegate specifies a return type as object,
// but you can assign a method that returns a string.
Func<object> del = GetString;
// Contravariance. A delegate specifies a parameter type as string,
// but you can assign a method that takes an object.
Action<string> del2 = SetObject;
}
Dalam .NET Framework 4 dan versi yang lebih baru, C# mendukung kovariansi dan kontravariansi dalam antarmuka generik dan delegasi dan memungkinkan konversi implisit parameter jenis generik. Untuk informasi selengkapnya, lihat Varians dalam Antarmuka Generik (C#) dan Varians di Delegasi (C#).
Contoh kode berikut menunjukkan konversi referensi implisit untuk antarmuka generik.
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;
Antarmuka atau delegasi generik disebut varian jika parameter generiknya dinyatakan kovarian atau kontravarian. C# memungkinkan Anda membuat antarmuka dan delegasi varian Anda sendiri. Untuk informasi selengkapnya, lihat Membuat Antarmuka Generik Varian (C#) dan Variansi pada Delegasi (C#).
Topik Terkait
| Judul | Deskripsi |
|---|---|
| Varians dalam Antarmuka Generik (C#) | Membahas kovarian dan kontravariansi dalam antarmuka generik dan menyediakan daftar antarmuka generik varian di .NET. |
| Membuat Antarmuka Generik Varian (C#) | Memperlihatkan cara membuat antarmuka varian kustom. |
| Menggunakan Varians dalam Antarmuka untuk Koleksi Generik (C#) | Menunjukkan bagaimana dukungan kovariansi dan kontravariansi di IEnumerable<T> antarmuka dan IComparable<T> dapat membantu Anda menggunakan kembali kode. |
| Variansi pada Delegasi (C#) | Membahas kovarians dan kontravariansi dalam delegasi generik dan non-generik serta memberikan daftar varian delegasi generik di .NET. |
| Menggunakan Varians dalam Delegasi (C#) | Menunjukkan cara menggunakan dukungan kovariansi dan kontravariansi dalam delegasi non-generik untuk menyelaraskan tanda tangan metode dengan tipe delegasi. |
| Menggunakan Varian untuk Delegasi Generik Func dan Action (C#) | Menunjukkan bagaimana dukungan kovarians dan kontravariansi pada delegasi Func dan Action dapat membantu Anda menggunakan kembali kode. |