我正在查看 IOrderedEnumerable 的声明,令我惊讶的是它的 TElement 类型参数不是协变的。
public interface IOrderedEnumerable<TElement> : IEnumerable<TElement>, IEnumerable
{
IOrderedEnumerable<TElement> CreateOrderedEnumerable<TKey>(Func<TElement, TKey> keySelector, IComparer<TKey> comparer, bool descending);
}
Run Code Online (Sandbox Code Playgroud)
它没有成为协变的原因是什么?
这是一个疏忽,已在 .NET Core 中修复。这是有关该问题的(已关闭)问题,这是修复该问题的拉取请求。
我认为它没有在完整的 .NET 版本中得到修复,因为这是一个重大变化。例如(想法取自此答案,这是关于另一个重大更改,但也适用于此处):
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");
}
}
Run Code Online (Sandbox Code Playgroud)
然后你打电话
Derived d = new Derived();
d.DoSomething(new List<string>().OrderBy(c => c));
Run Code Online (Sandbox Code Playgroud)
如果IOrderedEnumerable不是协变 -Base将调用方法。现在假设我们将其更改为协变。当我们下次编译这段代码时,突然Derived调用方法。
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |