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.
.NET Framework 4 memperkenalkan dukungan varians untuk beberapa antarmuka generik yang ada. Dukungan varians memungkinkan konversi implisit kelas yang mengimplementasikan antarmuka ini.
Dimulai dengan .NET Framework 4, antarmuka berikut adalah varian:
IEnumerable<T> (T covariant)
IEnumerator<T> (T covariant)
IQueryable<T> (T covariant)
IGrouping<TKey,TElement> (
TKeydanTElementbersifat kovarian)IComparer<T> (T bersifat kontravarian)
IEqualityComparer<T> (T bersifat kontravarian)
IComparable<T> (T bersifat kontravarian)
Dimulai dengan .NET Framework 4.5, antarmuka berikut adalah varian:
IReadOnlyList<T> (T covariant)
IReadOnlyCollection<T> (T covariant)
Kovarian memungkinkan suatu metode untuk memiliki jenis pengembalian yang lebih spesifik daripada yang ditentukan oleh parameter jenis generik dari antarmuka. Untuk mengilustrasikan fitur kovarians, pertimbangkan antarmuka generik ini: IEnumerable<Object> dan IEnumerable<String>. Antarmuka IEnumerable<String> tidak mewarisi IEnumerable<Object> antarmuka. Namun, jenis String mewarisi jenis Object, dan dalam beberapa kasus Anda mungkin ingin menetapkan objek dari antarmuka ini satu sama lain. Ini ditunjukkan dalam contoh kode berikut.
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;
Dalam versi .NET Framework yang lebih lama, kode ini menyebabkan kesalahan kompilasi di C# dan, jika Option Strict aktif, di Visual Basic. Tetapi sekarang Anda dapat menggunakan strings alih-alih objects, seperti yang ditunjukkan pada contoh sebelumnya, karena IEnumerable<T> antarmukanya kovarian.
Kontravarian memungkinkan metode untuk memiliki jenis argumen yang kurang diturunkan dari yang ditentukan oleh parameter generik antarmuka. Untuk mengilustrasikan kontravariansi, asumsikan bahwa Anda telah membuat BaseComparer kelas untuk membandingkan BaseClass instans kelas. Kelas BaseComparer menerapkan antarmuka IEqualityComparer<BaseClass>. Karena antarmuka IEqualityComparer<T> sekarang kontravarian, Anda dapat menggunakan BaseComparer untuk membandingkan instans kelas yang mewarisi kelas BaseClass. Ini ditunjukkan dalam contoh kode berikut.
// Simple hierarchy of classes.
class BaseClass { }
class DerivedClass : BaseClass { }
// Comparer class.
class BaseComparer : IEqualityComparer<BaseClass>
{
public int GetHashCode(BaseClass baseInstance)
{
return baseInstance.GetHashCode();
}
public bool Equals(BaseClass x, BaseClass y)
{
return x == y;
}
}
class Program
{
static void Test()
{
IEqualityComparer<BaseClass> baseComparer = new BaseComparer();
// Implicit conversion of IEqualityComparer<BaseClass> to
// IEqualityComparer<DerivedClass>.
IEqualityComparer<DerivedClass> childComparer = baseComparer;
}
}
Untuk contoh selengkapnya, lihat Menggunakan Varians di Antarmuka untuk Koleksi Generik (C#).
Varians dalam antarmuka generik hanya didukung untuk tipe referensi. Tipe nilai tidak mendukung keberagaman. Misalnya, IEnumerable<int> tidak dapat dikonversi secara implisit ke IEnumerable<object>, karena bilangan bulat diwakili oleh jenis nilai.
IEnumerable<int> integers = new List<int>();
// The following statement generates a compiler error,
// because int is a value type.
// IEnumerable<Object> objects = integers;
Penting juga untuk diingat bahwa kelas yang mengimplementasikan antarmuka varian masih invarian. Misalnya, meskipun List<T> mengimplementasikan antarmuka IEnumerable<T>kovarian , Anda tidak dapat secara implisit mengonversi List<String> ke List<Object>. Ini diilustrasikan dalam contoh kode berikut.
// The following line generates a compiler error
// because classes are invariant.
// List<Object> list = new List<String>();
// You can use the interface object instead.
IEnumerable<Object> listObjects = new List<String>();