Condividi tramite


Out (modificatore generico) (Visual Basic)

Per i parametri di tipo generico, la Out parola chiave specifica che il tipo è covariante.

Osservazioni:

La Covarianza consente di usare un tipo più derivato di quello specificato dal parametro generico. Ciò consente la conversione implicita di classi che implementano interfacce varianti e la conversione implicita dei tipi delegati.

Per altre informazioni, vedere Covarianza e Controvarianza.

Regole

È possibile usare la Out parola chiave in interfacce e delegati generici.

In un'interfaccia generica, un parametro di tipo può essere dichiarato covariante se soddisfa le condizioni seguenti:

  • Il parametro type viene usato solo come tipo restituito di metodi di interfaccia e non usato come tipo di argomenti del metodo.

    Annotazioni

    Esiste un'eccezione a questa regola. Se in un'interfaccia covariante si dispone di un delegato generico controvariante come parametro del metodo, è possibile usare il tipo covariante come parametro di tipo generico per questo delegato. Per altre informazioni sui delegati generici covarianti e controvarianti, vedere Varianza nei delegati e Uso della varianza per i delegati generici func e action.

  • Il parametro di tipo non viene usato come vincolo generico per i metodi di interfaccia.

In un delegato generico, un parametro di tipo può essere dichiarato covariante se viene usato solo come tipo restituito del metodo e non usato per gli argomenti del metodo.

La Covarianza e la controvarianza sono supportate per i tipi di riferimento, ma non sono supportate per i tipi valore.

In Visual Basic non è possibile dichiarare eventi nelle interfacce covariante senza specificare il tipo delegato. Inoltre, le interfacce covariante non possono avere classi annidate, enumerazioni o strutture, ma possono avere interfacce annidate.

Comportamento

Un'interfaccia con un parametro di tipo covariante consente ai relativi metodi di restituire più tipi derivati rispetto a quelli specificati dal parametro di tipo. Ad esempio, poiché in .NET Framework 4, in IEnumerable<T>, il tipo T è covariante, è possibile assegnare un oggetto del IEnumerable(Of String) tipo a un oggetto del IEnumerable(Of Object) tipo senza usare metodi di conversione speciali.

A un delegato covariante può essere assegnato un altro delegato dello stesso tipo, ma con un parametro di tipo generico più derivato.

Esempio 1

Nell'esempio seguente viene illustrato come dichiarare, estendere e implementare un'interfaccia generica covariante. Illustra anche come usare la conversione implicita per le classi che implementano un'interfaccia covariante.

' 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

Esempio 2

Nell'esempio seguente viene illustrato come dichiarare, creare un'istanza e richiamare un delegato generico covariante. Viene inoltre illustrato come usare la conversione implicita per i tipi delegati.

' 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

Vedere anche