Megosztás a következőn keresztül:


In (Általános módosító) (Visual Basic)

Általános típusparaméterek esetén a In kulcsszó azt határozza meg, hogy a típusparaméter contravariant.

Megjegyzések

A contravariance lehetővé teszi, hogy az általános paraméter által megadottnál kevésbé származtatott típust használjon. Ez lehetővé teszi a variáns interfészeket megvalósító osztályok implicit átalakítását és a delegált típusok implicit konvertálását.

További információ: Kovariancia és Contravariance.

Szabályok

A kulcsszót In általános felületeken és meghatalmazottakban is használhatja.

A típusparaméterek kontravariantnak deklarálhatók egy általános felületen vagy delegáltban, ha csak metódusargumentumok típusaként használják, és nem használják metódusvisszautasítási típusként. ByRef a paraméterek nem lehetnek kovariantok vagy contravariantok.

A kovariancia és a kontravariancia referenciatípusok esetén támogatott, és értéktípusok esetében nem támogatott.

A Visual Basicben nem deklarálhat eseményeket a contravariant felületeken a delegált típus megadása nélkül. A contravariant interfészek nem tartalmazhatnak beágyazott osztályokat, számokat vagy struktúrákat, de beágyazott felületekkel is rendelkezhetnek.

Működés

A contravariant típusú paraméterrel rendelkező interfészek lehetővé teszik a metódusok számára, hogy a felülettípus paraméterében megadottaknál kevésbé származtatott típusú argumentumokat fogadjanak el. Mivel például a 4. .NET-keretrendszer felületén a IComparer<T> T típus contravariant, a típus objektumát IComparer(Of Person) anélkül rendelheti hozzá a típus objektumáhozIComparer(Of Employee), hogy ne használjon speciális konverziós módszereket, ha Employee az öröklődik.Person

A contravariant delegált egy másik, azonos típusú delegáltat is hozzárendelhet, de kevésbé származtatott általános típusparaméterrel.

Példa – contravariant generic interface

Az alábbi példa bemutatja, hogyan deklarálhat, bővíthet és implementálhat egy contravariant általános felületet. Azt is bemutatja, hogyan használhat implicit konverziót az ezen felületet megvalósító osztályokhoz.

' 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

Példa – contravariant általános meghatalmazott

Az alábbi példa bemutatja, hogyan deklarálhat, hozhat létre és hívhat meg contravariant általános meghatalmazottat. Azt is bemutatja, hogyan konvertálhat implicit módon egy delegálttípust.

' 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

Lásd még