为什么Enumerable.ToLookup<>()会返回ILookup<,>而不是查找<,>?

时间:2010-10-03 15:51:11

标签: .net api-design enumerable

Lookup<,>中的一个方法不在ILookup<,>中:

public IEnumerable<TResult> ApplyResultSelector<TResult>(
    Func<TKey, IEnumerable<TElement>, TResult> resultSelector);

为什么Enumerable.ToLookup<>()的返回类型声明为ILookup<,>,尽管它似乎总是返回Lookup<,>的实例?如果返回类型被声明为Lookup<,>,则可以在没有强制转换的情况下使用上述方法。

1 个答案:

答案 0 :(得分:16)

设计公共API的最佳实践要求返回接口比返回具体类更好,因为如果需要,可以返回不同的具体类。 API的使用者不应该依赖于返回的特定类型的实例。

正如您所指出的,ToListToDictionary返回具体类型而不是接口。也许这样做的原因是,ToListToDictionary旨在为您提供一份副本,您可以根据需要修改。由于IListIDictionary接口并不能保证它们是可编辑的(这可能是一个坏主意),因此设计人员决定返回具体类型。

想象一下假设的ToIList()方法。如果在数组上调用,则可以实现它以返回数组的副本,因为数组实现IList<T>。然后,您可能会惊讶地发现调用Add()会抛出。

另一方面,ILookup是只读接口,因此上述内容不适用。因此,没有理由遵循最佳做法,就像ToList一样。