Więcej informacji można znaleźć here.
Parametr out
tworzy kowariancję parametru. Oznacza to, że możesz użyć typu lub dowolnego typu pochodnego. Zauważ, że out
działa tylko w ten sposób w przypadku generycznych, ma inne znaczenie, gdy jest używany w sygnaturach metod (chociaż prawdopodobnie już to wiedziałeś).
Oto przykład wzięty z 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;
}
}
Jak widać, out
w podpisie interfejs pozwala można przypisać ICovariant<String>
do zmiennej ICovariant<Object>
, jak String
wywodzi Object
. Bez słowa kluczowego out
nie byłbyś w stanie tego zrobić, ponieważ typy byłyby różne.
Możesz przeczytać więcej o kowariancji (i powiązanej sprzeczności) here.
W innych odpowiedzi podkreśliło, IEnumerable
został wykonany tylko w .NET kowariantna 4. Próba pisania kodu, takich jak:
IEnumerable<Object> strings = new List<string>();
zostanie skompilowany w .NET 4 i nowsze wersje, ale nie w poprzednich wersjach .
bo interfejs jest kowariantna – Jodrell
wygląd tutaj http://stackoverflow.com/questions/6732299/why-was-ienumerablet-made-covariant-in-c-sharp-4 – Likurg
[kowariancji i kontrawariancja] (http://msdn.microsoft.com/en-us/library/ee207183) – jrummell