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 创建 Lookup。
但返回类型却是 ILookup<TKey, TElement>
。
在Edulinq中,Jon Skeet提到返回类型是 List<T>
而不是 IList<T>
,但没有进一步讨论这个主题。
经过广泛搜索,没有找到答案,所以我问你:
不将返回值类型定义为接口背后是否存在任何设计决策,还是只是偶然事件?
IList
的特定实现。只要返回一个IList
实现,对您来说就没有任何区别。公平地说,该方法也被称为ToList
而不是ToIList
。 - CharlehList
类比IList
接口具有更丰富的扩展功能。在效用和纯度之间需要做出选择。 - Jodrell