Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Per i parametri di tipo generico, la out parola chiave specifica che il parametro di tipo è covariante. È possibile usare la out parola chiave in interfacce e delegati generici.
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 covarianti e la conversione implicita dei tipi delegati. La Covarianza e la controvarianza sono supportate per i tipi di riferimento, ma non sono supportate per i tipi valore.
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.
Per altre informazioni, vedere Covarianza e Controvarianza.
Esempio - Interfaccia generica covariante
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<out R> { }
// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }
// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }
class Program
{
static void Test()
{
ICovariant<Object> iobj = new Sample<Object>();
ICovariant<String> istr = new Sample<String>();
// You can assign istr to iobj because
// the ICovariant interface is covariant.
iobj = istr;
}
}
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.
Esempio - Delegato generico covariante
Nell'esempio seguente viene illustrato come dichiarare, creare un'istanza e richiamare un delegato generico covariante. Viene inoltre illustrato come convertire in modo implicito i tipi delegati.
// Covariant delegate.
public delegate R DCovariant<out R>();
// Methods that match the delegate signature.
public static Control SampleControl()
{ return new Control(); }
public static Button SampleButton()
{ return new Button(); }
public void Test()
{
// Instantiate the delegates with the methods.
DCovariant<Control> dControl = SampleControl;
DCovariant<Button> dButton = SampleButton;
// You can assign dButton to dControl
// because the DCovariant delegate is covariant.
dControl = dButton;
// Invoke the delegate.
dControl();
}
In un delegato generico, un tipo può essere dichiarato covariante se viene usato solo come tipo restituito del metodo e non usato per gli argomenti del metodo.
Specificazione del linguaggio C#
Per altre informazioni, vedere la specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.