この投稿 ( http://blogs.msdn.com/b/brada/archive/2005/01/18/355755.aspx ) はIEnumerable<T>
、反変であると述べています。out
ただし、型 T はパラメーターであるため、共変です。では、どのような文脈でIEnumerable<T>
反変でしょうか??
混乱しないことを願っています!事前に答えてくれてありがとう!
この投稿 ( http://blogs.msdn.com/b/brada/archive/2005/01/18/355755.aspx ) はIEnumerable<T>
、反変であると述べています。out
ただし、型 T はパラメーターであるため、共変です。では、どのような文脈でIEnumerable<T>
反変でしょうか??
混乱しないことを願っています!事前に答えてくれてありがとう!
IEnumerable は反変ではありません。共変です。
MSDN (IEnumerable<(Of <(T>)>) Interface) から、次のようになります。
型パラメータ
うちT
列挙するオブジェクトの型。 この型パラメーターは共変です。つまり、指定した型またはより派生した型のいずれかを使用できます。
この投稿から、次のことがわかります。
基本クラス ライブラリが更新され、一般的に使用されるさまざまなインターフェイスで共変性と反変性がサポートされるようになりました。たとえば、IEnumerable は共変インターフェイス(IEnumerable) になりました。
サンプルコード:
// Covariant parameters can be used as result types
interface IEnumerator<out T>
{
T Current { get; }
bool MoveNext();
}
// Covariant parameters can be used in covariant result types
interface IEnumerable<out T>
{
IEnumerator<T> GetEnumerator();
}
// Contravariant parameters can be used as argument types
interface IComparer<in T>
{
bool Compare(T x, T y);
}
これに関するその他の例については、以下をご覧ください。
C# における共分散と反分散、パート 1 (Eric Lippert による共分散と反分散に関する優れた一連の投稿)