代码之家  ›  专栏  ›  技术社区  ›  Timwi

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

  •  9
  • Timwi  · 技术社区  · 15 年前

    方法在 Lookup<,> 那不是在 ILookup<,> :

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

    为什么返回类型是 Enumerable.ToLookup<>() 宣布为 iLookup<,> 尽管它似乎总是返回 查找& lt; ?如果返回类型声明为 查找& lt; ,上述方法不需要强制转换即可使用。

    1 回复  |  直到 15 年前
        1
  •  16
  •   Roman Starkov    15 年前

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

    正如你所指出的, ToList ToDictionary 返回具体类型而不是接口。可能是因为 托利斯特 图典 我们打算给你一份你可以 修改 如果你想的话。自从 IList IDictionary 接口不能保证它们是可编辑的(这可能是个坏主意),设计者决定返回具体的类型。

    想象一个假设 ToIList() 方法。如果对数组调用,则可以实现它以返回数组的副本,因为数组实现 IList<T> . 你可能会惊讶地发现这个电话 Add() 投掷。

    另一方面, ILookup 是只读接口,因此上述内容不适用。因此没有理由 遵循最佳实践,就像 托利斯特 .