Dela via


Kovarians och kontravarians (Visual Basic)

I Visual Basic aktiverar kovarians och kontravarians implicit referenskonvertering för matristyper, ombudstyper och generiska typargument. Kovarians bevarar tilldelningskompatibiliteten och kontravariansen återställer den.

Följande kod visar skillnaden mellan tilldelningskompatibilitet, kovarians och kontravarians.

' 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

Kovarians för matriser möjliggör implicit konvertering av en matris av en mer härledd typ till en matris av en mindre härledd typ. Men den här åtgärden är inte typsäker, som du ser i följande kodexempel.

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

Med stöd för kovarians och kontravarians för metodgrupper kan du matcha metodsignaturer med ombudstyper. På så sätt kan du tilldela ombud inte bara metoder som har matchande signaturer, utan även metoder som returnerar fler härledda typer (kovarians) eller som accepterar parametrar som har mindre härledda typer (kontravarians) än de som anges av ombudstypen. Mer information finns i Varians i ombud (Visual Basic) och Använda avvikelse i ombud (Visual Basic).

I följande kodexempel visas stöd för kovarians och kontravarians för metodgrupper.

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

I .NET Framework 4 eller senare stöder Visual Basic kovarians och kontravarians i allmänna gränssnitt och ombud och möjliggör implicit konvertering av generiska typparametrar. Mer information finns i Varians i allmänna gränssnitt (Visual Basic) och Varians i ombud (Visual Basic).

I följande kodexempel visas implicit referenskonvertering för generiska gränssnitt.

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

Ett generiskt gränssnitt eller ombud kallas variant om dess generiska parametrar deklareras som varianta eller kontravarianta. Visual Basic kan du skapa egna variantgränssnitt och ombud. Mer information finns i Creating Variant Generic Interfaces (Visual Basic) and Variance in Delegates (Visual Basic).

Rubrik Beskrivning
Varians i allmänna gränssnitt (Visual Basic) Diskuterar kovarians och kontravarians i generiska gränssnitt och innehåller en lista över generiska variantgränssnitt i .NET Framework.
Skapa generiska variantgränssnitt (Visual Basic) Visar hur du skapar anpassade variantgränssnitt.
Använda avvikelse i gränssnitt för generiska samlingar (Visual Basic) Visar hur stöd för kovarians och kontravarians i gränssnitten IEnumerable<T> och IComparable<T> kan hjälpa dig att återanvända kod.
Varians i ombud (Visual Basic) Diskuterar kovarians och kontravarians i generiska och icke-generiska ombud och innehåller en lista över olika generiska ombud i .NET Framework.
Använda varians i ombud (Visual Basic) Visar hur du använder stöd för kovarians och kontravarians i icke-generiska ombud för att matcha metodsignaturer med ombudstyper.
Använda varians för Func och åtgärd – allmänna ombud (Visual Basic) Visar hur stöd för kovarians och kontravarians i ombuden Func och Action kan hjälpa dig att återanvända kod.