Ulteriori informazioni possono essere trovate here.
Il out
rende il parametro di tipo covariante. Cioè, puoi usare il tipo o qualsiasi tipo derivato. Notare che out
funziona solo in questo modo con i generici, ha un significato diverso quando viene utilizzato nelle firme dei metodi (anche se probabilmente lo sapevate già).
Ecco l'esempio tratto dalla referenced page:
// 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;
}
}
Come si può vedere, la out
nella firma interfaccia permette di assegnare un ICovariant<String>
a una variabile ICovariant<Object>
, come String
deriva da Object
. Senza la parola chiave out
, non sarebbe possibile farlo, poiché i tipi sarebbero diversi.
È possibile leggere ulteriori informazioni sulla covarianza (e la controvarianza correlata) here.
Come altre risposte hanno sottolineato, IEnumerable
stata fatta solo covariante in .NET 4. cercare di scrivere codice come:
IEnumerable<Object> strings = new List<string>();
compilerà in .NET 4 e versioni successive, ma non nelle versioni precedenti .
perché l'interfaccia è covariante – Jodrell
un'occhiata qui http://stackoverflow.com/questions/6732299/why-was-ienumerablet-made-covariant-in-c-sharp-4 – Likurg
[Covarianza e controvarianza] (http://msdn.microsoft.com/en-us/library/ee207183) – jrummell