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

发布于 2024-09-26 13:24:12 字数 469 浏览 8 评论 0 原文

Lookup<,> 中有一个方法,而 ILookup<,> 中没有:

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

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

There is one method in Lookup<,> that is not in ILookup<,>:

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

Why is the return type of Enumerable.ToLookup<>() declared to be ILookup<,> despite the fact that it always seems to return an instance of Lookup<,>? If the return type were instead declared to be Lookup<,>, the above method could be used without a cast.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

已下线请稍等 2024-10-03 13:24:12

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

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

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

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

The best practices for designing public APIs dictate that returning an interface is a better idea than returning a concrete class, because you can then return a different concrete class if you need to. The consumer of the API is not supposed to rely on the returned instance being of a specific type.

As you point out, ToList and ToDictionary return concrete types rather than interfaces. Perhaps the reason for this is that ToList and ToDictionary were meant to return you a copy that you can modify should you want to. Since the IList and IDictionary interfaces do not guarantee you that they are editable (which was possibly a bad idea), the designers decided to return the concrete type.

Imagine a hypothetical ToIList() method. If called on an array, it could be implemented to return you a copy of the array, because arrays implement IList<T>. You might then be surprised to find out that calling Add() throws.

On the other hand, ILookup is a read-only interface, so the above doesn't apply. Hence there is no reason not to follow the best practice, like there is with ToList.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文