Lookup<,>
中的一个方法不在ILookup<,>
中:
public IEnumerable<TResult> ApplyResultSelector<TResult>(
Func<TKey, IEnumerable<TElement>, TResult> resultSelector);
为什么Enumerable.ToLookup<>()
的返回类型声明为ILookup<,>
,尽管它似乎总是返回Lookup<,>
的实例?如果返回类型被声明为Lookup<,>
,则可以在没有强制转换的情况下使用上述方法。
答案 0 :(得分:16)
设计公共API的最佳实践要求返回接口比返回具体类更好,因为如果需要,可以返回不同的具体类。 API的使用者不应该依赖于返回的特定类型的实例。
正如您所指出的,ToList
和ToDictionary
返回具体类型而不是接口。也许这样做的原因是,ToList
和ToDictionary
旨在为您提供一份副本,您可以根据需要修改。由于IList
和IDictionary
接口并不能保证它们是可编辑的(这可能是一个坏主意),因此设计人员决定返回具体类型。
想象一下假设的ToIList()
方法。如果在数组上调用,则可以实现它以返回数组的副本,因为数组实现IList<T>
。然后,您可能会惊讶地发现调用Add()
会抛出。
另一方面,ILookup
是只读接口,因此上述内容不适用。因此,不没有理由遵循最佳做法,就像ToList
一样。