Out (modificatore generico) (Visual Basic)
Per i parametri di tipo generico, la parola chiave Out specifica che il tipo è covariante.
Note
La covarianza consente di utilizzare un tipo più derivato di quello specificato dal parametro generico. Ciò consente la conversione implicita di classi che implementano interfacce variant e la conversione implicita di tipi delegati.
Per ulteriori informazioni, vedere Covarianza e controvarianza (C# e Visual Basic).
Regole
È possibile utilizzare la parola chiave Out in interfacce e delegati generici.
In un'interfaccia generica, un parametro di tipo può essere dichiarato covariante se soddisfa le condizioni seguenti:
Il parametro di tipo viene utilizzato solo come tipo restituito di metodi di interfaccia e non viene utilizzato come tipo di argomenti del metodo.
Nota
Esiste un'eccezione a questa regola. Se in un'interfaccia covariante si dispone di un delegato generico controvariante come parametro del metodo, è possibile utilizzare il tipo covariante come parametro di tipo generico per questo delegato. Per ulteriori informazioni sui delegati generici covarianti e controvarianti, vedere Varianza nei delegati (C# e Visual Basic) e Utilizzo della varianza per i delegati generici Func e Action (C# e Visual Basic).
Il parametro di tipo non viene utilizzato come vincolo generico per i metodi di interfaccia.
In un delegato generico, un parametro di tipo può essere dichiarato covariante se viene utilizzato solo come tipo restituito del metodo e non per gli argomenti del metodo.
La covarianza e la controvarianza sono supportate per i tipi di riferimento, ma non per i tipi di valore.
In Visual Basic, non è possibile dichiarare eventi nelle interfacce covarianti senza specificare il tipo di delegato. Inoltre, le interfacce covarianti non possono disporre di strutture, enumerazioni o classi annidate, ma possono disporre di interfacce annidate.
Comportamento
Un'interfaccia che dispone di un parametro di tipo covariante consente ai metodi di restituire tipi più derivati di quelli specificati dal parametro di tipo. Poiché, ad esempio, in .NET Framework 4, nell'interfaccia IEnumerable<T>, il tipo T è covariante, è possibile assegnare un oggetto del tipo IEnumerabe(Of String) a un oggetto del tipo IEnumerable(Of Object) senza utilizzare alcun metodo di conversione speciale.
A un delegato covariante può essere assegnato un altro delegato dello stesso tipo, ma con un parametro di tipo generico più derivato.
Esempio
Nell'esempio seguente viene illustrato come dichiarare, estendere e implementare un'interfaccia generica covariante. Viene inoltre illustrato come utilizzare 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
Nell'esempio seguente viene illustrato come dichiarare, creare un'istanza e richiamare un delegato generico covariante. Viene inoltre illustrato come sia possibile utilizzare 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
Riferimenti
In (modificatore generico) (Visual Basic)