Dela via


I (allmän modifierare) (Visual Basic)

För generiska typparametrar anger nyckelordet In att typparametern är kontravariant.

Kommentarer

Med kontravarians kan du använda en mindre härledd typ än den som anges av den generiska parametern. Detta möjliggör implicit konvertering av klasser som implementerar variantgränssnitt och implicit konvertering av ombudstyper.

Mer information finns i Covariance och Contravariance.

Regler

Du kan använda nyckelordet In i allmänna gränssnitt och ombud.

En typparameter kan deklareras som kontravariant i ett allmänt gränssnitt eller ombud om den endast används som en typ av metodargument och inte används som en metodreturtyp. ByRef parametrar får inte vara covarianta eller kontravarianta.

Kovarians och kontravarians stöds för referenstyper och stöds inte för värdetyper.

I Visual Basic kan du inte deklarera händelser i kontravarianta gränssnitt utan att ange ombudstypen. Dessutom kan kontravarianta gränssnitt inte ha kapslade klasser, uppräkningar eller strukturer, men de kan ha kapslade gränssnitt.

Funktionssätt

Med ett gränssnitt som har en parameter av typen contravariant kan dess metoder acceptera argument av mindre härledda typer än de som anges av parametern för gränssnittstyp. Eftersom du till exempel i .NET Framework 4 i IComparer<T> gränssnittet skriver T är kontravariant kan du tilldela ett objekt av IComparer(Of Person) typen till ett objekt av IComparer(Of Employee) typen utan att använda några särskilda konverteringsmetoder om Employee ärver från Person.

Ett kontravariant ombud kan tilldelas ett annat ombud av samma typ, men med en mindre härledd generisk typparameter.

Exempel – kontravariant generiskt gränssnitt

I följande exempel visas hur du deklarerar, utökar och implementerar ett kontravariant generiskt gränssnitt. Den visar också hur du kan använda implicit konvertering för klasser som implementerar det här gränssnittet.

' 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

Exempel – kontravariant allmän delegat

I följande exempel visas hur du deklarerar, instansierar och anropar en kontravariant allmän delegat. Den visar också hur du implicit kan konvertera en ombudstyp.

' 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

Se även