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