Udostępnij za pośrednictwem


W (Generic modyfikator) (Visual Basic)

Parametry typu rodzajowego In słowa kluczowego Określa, że parametr typu jest kontrawariantnego.

Uwagi

Kontrawariancja umożliwia korzystanie z typem pochodnym mniej niż określony przez parametr rodzajowy.Pozwala to na niejawna konwersja klasy, które implementują interfejsy wariantu i niejawna konwersja typu obiektu delegowanego.

Aby uzyskać więcej informacji, zobacz Kowariancja i Kontrawariancja (C# i Visual Basic).

Zasady

Można użyć In słowa kluczowego w interfejsach rodzajowy i delegatów.

Parametr typu może być deklarowana kontrawariantnego w rodzajowy interfejsem ani obiektem delegowanym, jeśli jest używane tylko jako typ argumenty tej metody i nie jest używany jako typu zwrotnego metody.ByRefParametry nie może być kowariantnego lub kontrawariantnego.

Kowariancja i kontrawariancja są obsługiwane typy odwołań i nie jest obsługiwany dla typów wartości.

W języku Visual Basic nie można zadeklarować zdarzenia w interfejsach kontrawariantnego bez określania typu obiektu delegowanego.Ponadto kontrawariantnego interfejsów nie można posiadać zagnieżdżonych klas, teksty stałe lub struktur, ale mogą być zagnieżdżone interfejsów.

Zachowanie

Interfejs, który ma parametr typu kontrawariantnego umożliwia jego metod zaakceptować argumenty Typy pochodne, mniej niż określona przez parametr typu interfejsu.Na przykład ponieważ w.NET Framework 4, w IComparer<T> interfejsu typu t jest kontrawariantnego, można przypisać obiekt IComparer(Of Person) typu obiektu z IComparer(Of Employee) pisanie bez użycia jakichkolwiek metod konwersji specjalnych, jeśli Person dziedziczy Employee.

Pełnomocnik kontrawariantnego mogą być przypisane innym delegat tego samego typu, ale mniej pochodnych parametr typu rodzajowego.

Przykład

Poniższy przykład pokazuje, jak zadeklarować, rozszerzenie i implementować interfejs generic kontrawariantnego.Pokazuje także, jak można użyć niejawna konwersja dla klasy, które implementują interfejsu.

' 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

Poniższy przykład pokazuje, jak zadeklarować, wystąpienia i wywoływać Delegat rodzajowy kontrawariantnego.Pokazuje również, jak można niejawnie przekonwertować typem obiektu delegowanego.

' 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ż

Informacje

Out (Generic modyfikator) (Visual Basic)

Koncepcje

Odchylenie w interfejsach rodzajowy (C# i Visual Basic)