扩展方法ToList()
返回一个List<TSource>
. 遵循相同的模式,ToDictionary()
返回 a 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>
,但没有进一步触及主题。
广泛搜索没有得到任何答案,所以我在这里问你:
在不将返回值输入为接口的背后是否有任何设计决定,还是只是偶然?