IEnumerable <T> Contra-variant怎么样?

GBa*_*nia 4 c# generics ienumerable covariance contravariance

这篇文章(http://blogs.msdn.com/b/brada/archive/2005/01/18/355755.aspx)说的IEnumerable<T>是Contra-variant.然而,类型T是共变体,因为它是out参数.那么在什么情况下IEnumerable<T>Contra-variant?

希望我不要混淆!谢谢你的答案提前!

Len*_*rri 9

IEnumerable不是反变体.这是协变的.

从MSDN (IEnumerable <(Of <(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); 
}
Run Code Online (Sandbox Code Playgroud)

有关此问题的更多示例,请查看:

协方差和逆变法常见问题解答

C#中的协方差和逆变,第一部分(Eric Lippert关于协方差和反演的大系列文章)

了解C#协方差和逆变(3)样本

  • 更重要的是:问题中引用的博客条目不正确.作者混淆了共同和反差.这很容易做到,IMO ...... (4认同)