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:

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

Zie ook