In (modyfikator ogólny) (Visual Basic)
W przypadku parametrów typu ogólnego słowo kluczowe określa, In
że parametr typu jest kontrawariantny.
Uwagi
Kontrawariancja umożliwia użycie mniej pochodnego typu niż określony przez parametr ogólny. Umożliwia to niejawną konwersję klas, które implementują interfejsy wariantów i niejawną konwersję typów delegatów.
Aby uzyskać więcej informacji, zobacz Covariance i Contravariance.
Reguły
Słowo kluczowe można użyć In
w interfejsach ogólnych i delegatach.
Parametr typu można zadeklarować jako kontrawariant w interfejsie ogólnym lub deleguj, jeśli jest używany tylko jako typ argumentów metody i nie jest używany jako typ zwracany przez metodę. ByRef
parametry nie mogą być kowariantne ani kontrawariantne.
Kowariancja i kontrawariancja są obsługiwane w przypadku typów odwołań i nie są obsługiwane w przypadku typów wartości.
W języku Visual Basic nie można deklarować zdarzeń w interfejsach kontrawariantnych bez określania typu delegata. Ponadto interfejsy kontrawariantne nie mogą mieć zagnieżdżonych klas, wyliczenia ani struktur, ale mogą mieć zagnieżdżone interfejsy.
Zachowanie
Interfejs, który ma kontrawariantny parametr typu, umożliwia jego metodom akceptowanie argumentów mniej pochodnych typów niż te określone przez parametr typu interfejsu. Na przykład, ponieważ w programie .NET Framework 4, w interfejsie IComparer<T> typ T jest kontrawariantny, można przypisać obiekt typu do obiektu IComparer(Of Employee)
IComparer(Of Person)
typu bez użycia żadnych specjalnych metod konwersji, jeśli Employee
dziedziczy z Person
klasy .
Delegat kontrawariantny może być przypisany do innego delegata tego samego typu, ale z mniej pochodnym parametrem typu ogólnego.
Przykład — interfejs ogólny contravariant
W poniższym przykładzie pokazano, jak deklarować, rozszerzać i implementować kontrawariantny interfejs ogólny. Pokazuje również, jak można użyć niejawnej konwersji dla klas implementujących ten interfejs.
' 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
Przykład — kontrawariantny delegat ogólny
W poniższym przykładzie pokazano, jak zadeklarować, utworzyć wystąpienie i wywołać kontrawariantnego delegata ogólnego. Pokazuje również, jak można niejawnie przekonwertować typ delegata.
' 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