IEnumerable 是如何逆变的?

2024-04-04

这个帖子 (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(使用前将#替换为@)

IEnumerable 是如何逆变的? 的相关文章

随机推荐