IEnumerable <t> Contra-variant怎么样?</t>

时间:2010-07-11 01:03:09

标签: 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?

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

1 个答案:

答案 0 :(得分:9)

IEnumerable不是反变体。它是协变的。

来自MSDN (IEnumerable<(Of <(T>)>) Interface)我们有:

  

输入参数

     

out T

     

要枚举的对象类型。   此类型参数是协变。也就是说,您可以使用任何一种类型   你指定的或任何更多的类型   的。

从这个post我们得到了:

  

基类库已更新,以支持协方差和   各种常见的逆转   用过的接口。例如,   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); 
}

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

Covariance and Contravariance FAQ

Covariance and Contravariance in C#, Part One(Eric Lippert关于协方差和反演的大量系列文章)

Understanding C# Covariance And Contravariance (3) Samples

相关问题