我正在查看 IOrderedEnumerable 的声明,令我惊讶的是它的 TElement 类型参数不是协变的。
public interface IOrderedEnumerable<TElement> : IEnumerable<TElement>, IEnumerable
{
IOrderedEnumerable<TElement> CreateOrderedEnumerable<TKey>(Func<TElement, TKey> keySelector, IComparer<TKey> comparer, bool descending);
}
它没有成为协变的原因是什么?
这是一个疏忽,已在 .NET Core 中修复。这是(已关闭)issue https://github.com/dotnet/corefx/issues/2317关于这一点,这是拉取请求 https://github.com/dotnet/corefx/pull/14076这解决了它。
我认为它没有在完整的 .NET 版本中得到修复,因为这是一个重大变化。例如(想法取自此answer https://stackoverflow.com/a/2843563/5311735这是另一个重大变化,但也适用于这里):
public class Base
{
public void DoSomething(IOrderedEnumerable<string> strings)
{
Console.WriteLine("Base");
}
}
public class Derived : Base
{
public void DoSomething(IOrderedEnumerable<object> objects)
{
Console.WriteLine("Derived");
}
}
然后你打电话
Derived d = new Derived();
d.DoSomething(new List<string>().OrderBy(c => c));
If IOrderedEnumerable
不是协变的 -Base
方法将被调用。现在假设我们将其更改为协变。当我们下次编译这段代码时,突然Derived
方法被调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)