为什么 Enumerable.ToLookup<>() 返回的是 ILookup<,> 而不是 Lookup<,>?

10

Lookup<,>类中有一个方法不在ILookup<,>接口中:

public IEnumerable<TResult> ApplyResultSelector<TResult>(
    Func<TKey, IEnumerable<TElement>, TResult> resultSelector);
为什么Enumerable.ToLookup<>()的返回类型声明为ILookup<,>,尽管它似乎总是返回Lookup<,>的实例?如果返回类型改为Lookup<,>,那么就不需要进行强制转换就可以使用上面的方法。
1个回答

16

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

正如你指出的那样,ToListToDictionary返回的是具体类型而不是接口。也许这样做的原因是,ToListToDictionary旨在返回您可以进行修改的副本。由于IListIDictionary接口不能保证它们是可编辑的(这可能是个坏主意),设计者决定返回具体类型。

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

另一方面,ILookup是只读接口,所以上述情况并不适用。因此,在像ToList这样的情况下,没有理由不遵循最佳实践。


4
那么,毫无疑问,“ToList”和“ToDictionary”设计得非常糟糕。 - Timwi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接