Udostępnij za pomocą


Kowariancja i kontrawariancja (Visual Basic)

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

Poniższy kod demonstruje różnicę między zgodnością przypisania, 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. Ale 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 wariancji i kontrawariancji dla grup metod umożliwia dopasowywanie podpisów metod z typami delegatów. To dopasowanie umożliwia przypisanie do delegata nie tylko metody, która ma zgodny podpis, ale także metodę, która:

  • Zwraca bardziej pochodny typ (kowariancja) niż typ zwracany określony przez typ delegata.
  • Akceptuje parametry o typach mniej pochodnych (kontrawariancja) niż te określone przez typ delegata.

Aby uzyskać więcej informacji, zobacz Wariancja w delegatach (Visual Basic) i Używanie wariancji w delegatach (Visual Basic).

Poniższy przykład kodu przedstawia obsługę kowariancji i 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 programie .NET Framework 4 lub nowszym język Visual Basic obsługuje wariancję i kontrawariancję w interfejsach ogólnych i delegatach oraz umożliwia niejawną konwersję parametrów typu ogólnego. Aby uzyskać więcej informacji, zobacz Wariancję w interfejsach ogólnych (Visual Basic) i Wariancję w delegatach (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

Interfejs ogólny lub delegat jest nazywany wariantem , jeśli jego parametry ogólne są deklarowane kowariantne lub kontrawariantne. Język Visual Basic umożliwia tworzenie własnych zróżnicowanych interfejsó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).

Nazwa Opis
Wariancja w interfejsach ogólnych (Visual Basic) Omówia wariancję i kontrawariancję w interfejsach ogólnych oraz podaje listę wariantów interfejsów ogólnych w frameworku .NET.
Tworzenie wariantów interfejsów ogólnych (Visual Basic) Pokazuje, jak tworzyć niestandardowe interfejsy wariantów.
Używanie wariancji w interfejsach dla kolekcji ogólnych (Visual Basic) Pokazuje, jak obsługa kowariancji i kontrawariancji w interfejsach IEnumerable<T> i IComparable<T> może pomóc w ponownym użyciu kodu.
Zmienność w delegatach (Visual Basic) Omówienie kowariancji i kontrawariancji w delegatach generycznych i niegenerycznych oraz przedstawienie listy wariantów delegatów generycznych w programie .NET Framework.
Używanie wariancji w delegatach (Visual Basic) Pokazuje, jak korzystać z obsługi kowariancji i kontrawariancji w delegatach nieogólnych, aby dopasować podpisy metod do typów delegatów.
Używanie wariancji dla delegatów ogólnych Func i Action (Visual Basic) Pokazuje, jak obsługa kowariancji i kontrawariancji w delegatach Func i Action może pomóc w ponownym użyciu kodu.