2010-10-03 109 views
9

有在Lookup<,>一个方法,是不是在ILookup<,>为什么Enumerable.ToLookup <>()返回一个ILookup <,>而不是查找<,>?

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

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

回答

15

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

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

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

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

+4

那么'ToList'和'ToDictionary'确实设计得非常糟糕。 – Timwi 2010-10-03 15:58:02

+0

@Timwi在编辑中解决了这个问题。 – 2010-10-03 16:16:18

相关问题