Condividi tramite


out (modificatore generico) (Riferimenti per C#)

Per i parametri di tipo generico, la out parola chiave specifica che il parametro di tipo è covariante. Usare la out parola chiave in interfacce e delegati generici.

La Covarianza consente di usare un tipo più derivato rispetto a quello specificato dal parametro generico. Questa funzionalità consente la conversione implicita di classi che implementano interfacce covarianti e la conversione implicita dei tipi delegati. Covarianza e controvarianza supportano i tipi riferimento, ma non supportano 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, in IEnumerable<T>, il tipo T è covariante, è possibile assegnare un oggetto del IEnumerable<string> tipo a un oggetto del IEnumerable<object> tipo senza usare metodi di conversione speciali.

È possibile assegnare un delegato covariante a un altro delegato dello stesso tipo, ma con un parametro di tipo generico più derivato.

Per altre informazioni, vedere Covarianza e Controvarianza.

Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle versioni di anteprima pubblica per la prossima versione del linguaggio di programmazione.

La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.

Suggerimento

Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.

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 dichiarare un parametro di tipo covariante se soddisfa le condizioni seguenti:

  • Usare il parametro type solo come tipo restituito di metodi di interfaccia e non usarlo come tipo di argomenti del metodo.

    Annotazioni

    C'è un'eccezione a questa regola. Se un'interfaccia covariante ha 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.

  • Non si usa il parametro di tipo come vincolo generico per i metodi di interfaccia.

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 dichiarare un tipo covariante se viene usato solo come tipo restituito dal metodo e non 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#.

Vedere anche