这个帖子 (http://blogs.msdn.com/b/brada/archive/2005/01/18/355755.aspx https://web.archive.org/web/20140417104304/http://blogs.msdn.com/b/brada/archive/2005/01/18/355755.aspx) says IEnumerable<T>
是逆变的。然而类型 T 是协变的,因为它是一个out
范围。那么在什么背景下IEnumerable<T>
逆变??
希望我没有感到困惑!感谢您提前的答复!
IEnumerable 不是逆变的。它是协变的。
来自MSDN(IEnumerable)>) 接口) https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1?view=net-5.0我们有:
类型参数
out T
要枚举的对象的类型。该类型参数是协变的。也就是说,您可以使用以下类型
您指定的或任何更多的类型
衍生的。
由此post http://blog.voidnish.com/?p=188我们有:
基类库已更新以支持协方差和
各种常见的逆变
使用的接口。例如,
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);
}
有关这方面的更多示例,请查看:
协变和逆变常见问题解答 https://learn.microsoft.com/en-us/archive/blogs/csharpfaq/covariance-and-contravariance-faq
C# 中的协变和逆变,第一部分 https://web.archive.org/web/20151107135457/http://blogs.msdn.com:80/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx(Eric Lippert 关于协方差和逆变的精彩系列文章)
理解C#协变和逆变(3)示例 https://weblogs.asp.net/dixin/understanding-csharp-covariance-and-contravariance-3-samples
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)