这篇帖子(http://blogs.msdn.com/b/brada/archive/2005/01/18/355755.aspx)说IEnumerable<T>
是Contra-variant。但是,类型T是共变体,因为它是out
参数。那么在什么情况下IEnumerable<T>
Contra-variant?
希望我不要混淆!谢谢你的答案!
答案 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关于协方差和反演的大量系列文章)