9

一种方法Lookup<,>不在ILookup<,>

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

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

4

1 回答 1

16

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

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

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

另一方面,ILookup是只读接口,所以上述不适用。因此,没有理由遵循最佳实践,就像ToList.

于 2010-10-03T15:53:59.973 回答