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.
Untuk parameter jenis generik, In kata kunci menentukan bahwa parameter jenis kontravarian.
Komentar
Kontravariansi memungkinkan Anda menggunakan jenis yang kurang diturunkan dari yang ditentukan oleh parameter generik. Ini memungkinkan konversi implisit kelas yang menerapkan antarmuka varian dan konversi implisit jenis delegasi.
Untuk informasi selengkapnya, lihat Kovariansi dan Kontravariansi.
Aturan
Anda dapat menggunakan In kata kunci di antarmuka generik dan delegasi.
Parameter jenis dapat dinyatakan kontravarian dalam antarmuka generik atau mendelegasikan jika hanya digunakan sebagai jenis argumen metode dan tidak digunakan sebagai jenis pengembalian metode.
ByRef parameter tidak boleh kovarian atau kontravarian.
Kovariansi dan kontravariansi didukung untuk jenis referensi dan tidak didukung untuk jenis nilai.
Di Visual Basic, Anda tidak dapat mendeklarasikan peristiwa dalam antarmuka kontravarian tanpa menentukan jenis delegasi. Selain itu, antarmuka yang kontravarian tidak dapat memiliki kelas, enum, atau struktur berlapis, tetapi dapat memiliki antarmuka berlapis.
Perilaku
Antarmuka yang memiliki parameter jenis kontravarian memungkinkan metodenya untuk menerima argumen jenis yang kurang diturunkan daripada yang ditentukan oleh parameter jenis antarmuka. Misalnya, karena dalam .NET Framework 4, di IComparer<T> antarmuka, jenis T kontravarian, Anda dapat menetapkan objek jenis IComparer(Of Person) ke objek jenis IComparer(Of Employee) tanpa menggunakan metode konversi khusus jika Employee mewarisi dari Person.
Delegasi kontravarian dapat ditetapkan delegasi lain dengan jenis yang sama, tetapi dengan parameter jenis generik yang kurang diturunkan.
Contoh - antarmuka generik kontravarian
Contoh berikut menunjukkan cara mendeklarasikan, memperluas, dan mengimplementasikan antarmuka generik yang kontravarian. Ini juga menunjukkan bagaimana Anda dapat menggunakan konversi implisit untuk kelas yang mengimplementasikan antarmuka ini.
' Contravariant interface.
Interface IContravariant(Of In A)
End Interface
' Extending contravariant interface.
Interface IExtContravariant(Of In A)
Inherits IContravariant(Of A)
End Interface
' Implementing contravariant interface.
Class Sample(Of A)
Implements IContravariant(Of A)
End Class
Sub Main()
Dim iobj As IContravariant(Of Object) = New Sample(Of Object)()
Dim istr As IContravariant(Of String) = New Sample(Of String)()
' You can assign iobj to istr, because
' the IContravariant interface is contravariant.
istr = iobj
End Sub
Contoh - delegasi generik kontravarian
Contoh berikut menunjukkan cara mendeklarasikan, membuat instans, dan memanggil delegasi generik yang kontravarian. Ini juga menunjukkan bagaimana Anda dapat secara implisit mengonversi jenis delegasi.
' Contravariant delegate.
Public Delegate Sub DContravariant(Of In A)(ByVal argument As A)
' Methods that match the delegate signature.
Public Shared Sub SampleControl(ByVal control As Control)
End Sub
Public Shared Sub SampleButton(ByVal control As Button)
End Sub
Private Sub Test()
' Instantiating the delegates with the methods.
Dim dControl As DContravariant(Of Control) =
AddressOf SampleControl
Dim dButton As DContravariant(Of Button) =
AddressOf SampleButton
' You can assign dControl to dButton
' because the DContravariant delegate is contravariant.
dButton = dControl
' Invoke the delegate.
dButton(New Button())
End Sub