扩展方法ToList()
返回List<TSource>
。按照相同的模式,ToDictionary()
返回Dictionary<TKey, TSource>
。
我很好奇为什么这些方法没有分别按IList<TSource>
和键入其返回值IDictionary<TKey, TSource>
。这似乎更奇怪,因为将ToLookup<TSource, TKey>
其返回值键入为接口而不是实际的实现。
通过使用dotPeek或其他反编译器查看这些扩展方法的源代码,我们看到以下实现(ToList()
由于它更短而显示):
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
return new List<TSource>(source);
}
那么,为什么此方法将其返回值键入接口的特定实现而不是接口本身呢?唯一的变化是返回类型。
我很好奇,因为IEnumerable<>
扩展名的签名非常一致,除了这两种情况。我一直认为这有点奇怪。
另外,为了使事情更加混乱,状态文档ToLookup()
:
根据指定的键选择器函数从IEnumerable创建查找。
但返回类型为ILookup<TKey, TElement>
。
在Edulinq中,Jon Skeet提到返回类型是,List<T>
而不是IList<T>
,但不再涉及主题。
广泛的搜索没有得到任何答案,所以在这里我问你:
不将返回值键入为接口背后有任何设计决定,还是偶然?