Más información se puede encontrar here.
El out
hace que el parámetro de tipo sea covariante. Es decir, puede usar el tipo o cualquier tipo derivado. Tenga en cuenta que out
solo funciona de esta forma con genéricos, tiene un significado diferente cuando se usa en firmas de métodos (aunque probablemente ya lo sabía).
Aquí está el ejemplo tomado de la 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;
}
}
Como se puede ver, el out
en la firma interfaz permite asignar una ICovariant<String>
a una variable ICovariant<Object>
, como se deriva de String
Object
. Sin la palabra clave out
, no podría hacer esto, ya que los tipos serían diferentes.
Puede leer más sobre la covarianza (y la contravariancia relacionada) here.
Como otras respuestas han señalado, IEnumerable
sólo fue covariante en .NET 4. Tratar de escribir código, tales como:
IEnumerable<Object> strings = new List<string>();
compilará en .NET 4 y versiones posteriores, pero no en las versiones anteriores .
porque la interfaz es covariante – Jodrell
vistazo aquí http://stackoverflow.com/questions/6732299/why-was-ienumerablet-made-covariant-in-c-sharp-4 – Likurg
[Covarianza y contravarianza] (http://msdn.microsoft.com/en-us/library/ee207183) – jrummell