4

この投稿 ( http://blogs.msdn.com/b/brada/archive/2005/01/18/355755.aspx ) はIEnumerable<T>、反変であると述べています。outただし、型 T はパラメーターであるため、共変です。では、どのような文脈でIEnumerable<T>反変でしょうか??

混乱しないことを願っています!事前に答えてくれてありがとう!

4

1 に答える 1

9

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 による共分散と反分散に関する優れた一連の投稿)

C# の共分散と反分散を理解する (3) サンプル

于 2010-07-11T01:12:11.060 に答える