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 Personklasy .

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

Zobacz też