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