4

这篇文章(http://blogs.msdn.com/b/brada/archive/2005/01/18/355755.aspx)说IEnumerable<T>是反变体。然而类型 T 是协变的,因为它是一个out参数。那么在什么情况下是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# 中的协变和逆变,第一部分(Eric Lippert 关于协变和逆变的系列文章)

理解C#协变和逆变(三)示例

于 2010-07-11T01:12:11.060 回答