Kowariancja i kontrawariancja (Visual Basic)

W Visual Basic kowariancja i kontrawariancja umożliwiają niejawną konwersję odwołania dla typów tablic, typów delegatów i argumentów typu ogólnego. Kowariancja zachowuje zgodność przypisań i kontrawariancję odwraca ją.

Poniższy kod przedstawia różnicę między zgodnością przypisań, kowariancją i kontrawariancją.

' Assignment compatibility.
Dim str As String = "test"
' An object of a more derived type is assigned to an object of a less derived type.
Dim obj As Object = str

' Covariance.
Dim strings As IEnumerable(Of String) = New List(Of String)()
' An object that is instantiated with a more derived type argument
' is assigned to an object instantiated with a less derived type argument.
' Assignment compatibility is preserved.
Dim objects As IEnumerable(Of Object) = strings

' Contravariance.
' Assume that there is the following method in the class:
' Shared Sub SetObject(ByVal o As Object)
' End Sub
Dim actObject As Action(Of Object) = AddressOf SetObject

' An object that is instantiated with a less derived type argument
' is assigned to an object instantiated with a more derived type argument.
' Assignment compatibility is reversed.
Dim actString As Action(Of String) = actObject

Kowariancja dla tablic umożliwia niejawną konwersję tablicy bardziej pochodnego typu na tablicę mniej pochodnego typu. Jednak ta operacja nie jest bezpieczna, jak pokazano w poniższym przykładzie kodu.

Dim array() As Object = New String(10) {}
' The following statement produces a run-time exception.
' array(0) = 10

Obsługa kowariancji i kontrawariancji dla grup metod umożliwia dopasowywanie podpisów metody z typami delegatów. Dzięki temu można przypisać do delegatów nie tylko metody, które mają zgodne podpisy, ale także metody, które zwracają więcej typów pochodnych (kowariancja) lub które akceptują parametry, które mają mniej pochodne typy (kontrawariancja) niż określone przez typ delegata. Aby uzyskać więcej informacji, zobacz Variance in Delegates (Visual Basic) (Wariancja w delegatach) i Using Variance in Delegates (Visual Basic)( (Używanie wariancji w delegatach).

W poniższym przykładzie kodu przedstawiono współwariancję i obsługę kontrawariancji dla grup metod.

Shared Function GetObject() As Object
    Return Nothing
End Function

Shared Sub SetObject(ByVal obj As Object)
End Sub

Shared Function GetString() As String
    Return ""
End Function

Shared Sub SetString(ByVal str As String)

End Sub

Shared Sub Test()
    ' Covariance. A delegate specifies a return type as object,
    ' but you can assign a method that returns a string.
    Dim del As Func(Of Object) = AddressOf GetString

    ' Contravariance. A delegate specifies a parameter type as string,
    ' but you can assign a method that takes an object.
    Dim del2 As Action(Of String) = AddressOf SetObject
End Sub

W .NET Framework 4 lub nowszych Visual Basic obsługuje kowariancję i kontrawariancję w interfejsach ogólnych i delegatach oraz umożliwia niejawną konwersję parametrów typu ogólnego. Aby uzyskać więcej informacji, zobacz Variance in Generic Interfaces (Visual Basic) (Wariancja w interfejsach ogólnych (Visual Basic) i Variance in Delegates (Visual Basic).

Poniższy przykład kodu przedstawia niejawną konwersję odwołania dla interfejsów ogólnych.

Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings

Ogólny interfejs lub delegat jest nazywany wariantem , jeśli jego parametry ogólne są deklarowane kowariantne lub kontrawariantne. Visual Basic umożliwia tworzenie własnych interfejsów wariantów i delegatów. Aby uzyskać więcej informacji, zobacz Tworzenie wariantów interfejsów ogólnych (Visual Basic) i Wariancja w delegatach (Visual Basic).

Tytuł Opis
Wariancja w interfejsach ogólnych (Visual Basic) Omówienie wariancji i kontrawariancji w interfejsach ogólnych i zawiera listę wariantów interfejsów ogólnych w .NET Framework.
Tworzenie wariantów interfejsów ogólnych (Visual Basic) Przedstawia sposób tworzenia niestandardowych interfejsów wariantów.
Używanie wariancji w interfejsach dla kolekcji ogólnych (Visual Basic) Pokazuje, jak kowariancja i kontrawariancja obsługi w IEnumerable<T> interfejsach i IComparable<T> mogą pomóc w ponownym użyciu kodu.
Wariancja w delegatach (Visual Basic) Omówienie kowariancji i kontrawariancji w delegatach ogólnych i niegenerycznych oraz zawiera listę wariantów delegatów ogólnych w .NET Framework.
Używanie wariancji w delegatach (Visual Basic) Pokazuje, jak używać obsługi kowariancji i kontrawariancji w delegatach innych niż ogólne w celu dopasowania podpisów metody do typów delegatów.
Używanie wariancji dla delegatów ogólnych Func i Action (Visual Basic) Pokazuje, jak kowariancja i kontrawariancja w obiekcie Func i Action delegatów mogą pomóc w ponownym użyciu kodu.