Out (Generic Modifier) (Visual Basic)
Voor algemene typeparameters geeft het Out
trefwoord aan dat het type covariant is.
Opmerkingen
Met covariantie kunt u een meer afgeleid type gebruiken dan dat is opgegeven door de algemene parameter. Dit maakt impliciete conversie mogelijk van klassen die variantinterfaces implementeren en impliciete conversie van gedelegeerde typen.
Zie Covariantie en Contravariantie voor meer informatie.
Regels
U kunt het Out
trefwoord gebruiken in algemene interfaces en gemachtigden.
In een algemene interface kan een typeparameter covariant worden gedeclareerd als deze voldoet aan de volgende voorwaarden:
De typeparameter wordt alleen gebruikt als retourtype interfacemethoden en niet gebruikt als een type methodeargumenten.
Notitie
Er is één uitzondering op deze regel. Als u in een covariant-interface een algemene gemachtigde hebt als een methodeparameter, kunt u het covarianttype gebruiken als een algemene typeparameter voor deze gemachtigde. Voor meer informatie over covariant en contravariant algemene gemachtigden raadpleegt u Variantie in Gemachtigden en Variantie gebruiken voor Algemene gedelegeerden voor Func en Actie algemene gedelegeerden.
De typeparameter wordt niet gebruikt als een algemene beperking voor de interfacemethoden.
In een algemene gemachtigde kan een typeparameter covariant worden gedeclareerd als deze alleen wordt gebruikt als retourtype methode en niet wordt gebruikt voor methodeargumenten.
Covariantie en contravariantie worden ondersteund voor referentietypen, maar worden niet ondersteund voor waardetypen.
In Visual Basic kunt u geen gebeurtenissen declareren in covariantinterfaces zonder het type gedelegeerde op te geven. Covariant-interfaces kunnen ook geen geneste klassen, opsommingen of structuren hebben, maar ze kunnen geneste interfaces hebben.
Gedrag
Met een interface met een parameter voor het covarianttype kunnen de methoden meer afgeleide typen retourneren dan de methoden die zijn opgegeven door de typeparameter. Omdat in .NET Framework 4 bijvoorbeeld type IEnumerable<T>T covariant is, kunt u een object van het IEnumerable(Of String)
type toewijzen aan een object van het IEnumerable(Of Object)
type zonder speciale conversiemethoden te gebruiken.
Aan een covariant gedelegeerde kan een andere gemachtigde van hetzelfde type worden toegewezen, maar met een meer afgeleide algemene typeparameter.
Voorbeeld 1
In het volgende voorbeeld ziet u hoe u een algemene covariant-interface declareert, uitbreidt en implementeert. Ook ziet u hoe u impliciete conversie gebruikt voor klassen die een covariant-interface implementeren.
' Covariant interface.
Interface ICovariant(Of Out R)
End Interface
' Extending covariant interface.
Interface IExtCovariant(Of Out R)
Inherits ICovariant(Of R)
End Interface
' Implementing covariant interface.
Class Sample(Of R)
Implements ICovariant(Of R)
End Class
Sub Main()
Dim iobj As ICovariant(Of Object) = New Sample(Of Object)()
Dim istr As ICovariant(Of String) = New Sample(Of String)()
' You can assign istr to iobj because
' the ICovariant interface is covariant.
iobj = istr
End Sub
Voorbeeld 2
In het volgende voorbeeld ziet u hoe u een algemene gemachtigde voor covariant declareert, instantiëren en aanroept. U ziet ook hoe u impliciete conversie kunt gebruiken voor gedelegeerde typen.
' Covariant delegate.
Public Delegate Function DCovariant(Of Out R)() As R
' Methods that match the delegate signature.
Public Shared Function SampleControl() As Control
Return New Control()
End Function
Public Shared Function SampleButton() As Button
Return New Button()
End Function
Private Sub Test()
' Instantiating the delegates with the methods.
Dim dControl As DCovariant(Of Control) =
AddressOf SampleControl
Dim dButton As DCovariant(Of Button) =
AddressOf SampleButton
' You can assign dButton to dControl
' because the DCovariant delegate is covariant.
dControl = dButton
' Invoke the delegate.
dControl()
End Sub