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. Antarmuka berikut sekarang merupakan varian:
IEnumerable<T> (T covariant)
IEnumerator<T> (T covariant)
IQueryable<T> (T covariant)
IGrouping<TKey,TElement> (
TKey
danTElement
bersifat kovarian)IComparer<T> (T bersifat kontravarian)
IEqualityComparer<T> (T bersifat kontravarian)
IComparable<T> (T bersifat kontravarian)
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(Of Object)
dan IEnumerable(Of String)
. Antarmuka IEnumerable(Of String)
tidak mewarisi IEnumerable(Of 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.
Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings
Dalam versi .NET Framework yang lebih lama, kode ini menyebabkan kesalahan kompilasi di Visual Basic dengan Option Strict On
. 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(Of 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
End Class
Class DerivedClass
Inherits BaseClass
End Class
' Comparer class.
Class BaseComparer
Implements IEqualityComparer(Of BaseClass)
Public Function Equals1(ByVal x As BaseClass,
ByVal y As BaseClass) As Boolean _
Implements IEqualityComparer(Of BaseClass).Equals
Return (x.Equals(y))
End Function
Public Function GetHashCode1(ByVal obj As BaseClass) As Integer _
Implements IEqualityComparer(Of BaseClass).GetHashCode
Return obj.GetHashCode
End Function
End Class
Sub Test()
Dim baseComparer As IEqualityComparer(Of BaseClass) = New BaseComparer
' Implicit conversion of IEqualityComparer(Of BaseClass) to
' IEqualityComparer(Of DerivedClass).
Dim childComparer As IEqualityComparer(Of DerivedClass) = baseComparer
End Sub
Untuk contoh selengkapnya, lihat Menggunakan Varians di Antarmuka untuk Koleksi Generik (Visual Basic).
Varians dalam antarmuka generik hanya didukung untuk tipe referensi. Tipe nilai tidak mendukung keberagaman. Misalnya, IEnumerable(Of Integer)
tidak dapat dikonversi secara implisit ke IEnumerable(Of Object)
, karena bilangan bulat diwakili oleh jenis nilai.
Dim integers As IEnumerable(Of Integer) = New List(Of Integer)
' The following statement generates a compiler error
' with Option Strict On, because Integer is a value type.
' Dim objects As IEnumerable(Of Object) = 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(Of Object)
ke List(Of String)
. Ini diilustrasikan dalam contoh kode berikut.
' The following statement generates a compiler error
' because classes are invariant.
' Dim list As List(Of Object) = New List(Of String)
' You can use the interface object instead.
Dim listObjects As IEnumerable(Of Object) = New List(Of String)