【问题标题】:Why HashSet<T> does not implement IReadOnlyCollection<T>?为什么 HashSet<T> 没有实现 IReadOnlyCollection<T>?
【发布时间】:2012-08-04 16:44:59
【问题描述】:

我刚刚发现 .NET Fx 现在有 3 个有用的接口:

  1. IReadOnlyCollection&lt;T&gt;
  2. IReadOnlyList&lt;T&gt;
  3. IReadOnlyDictionary&lt;K,V&gt;

我有点困惑为什么HashSet&lt;T&gt; 不实现IReadOnlyCollection&lt;T&gt;?有什么原因,还是微软又忘记了集合?

UPD

经过两个小时的谷歌搜索,我发现 BCL 中有很多集合具有.Count 属性但没有实现IReadOnlyCollection&lt;T&gt; 接口。

UPD2

我找到了这篇帖子 http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b4fb991a-3f5c-4923-93d4-7cd5c004f859Immo Landwerth 的回答,他说如下

除了 List 和 Dictionary 之外的其他集合是否会更新为 支持这些接口吗?

当然。事实上,我们所有的内置集合类型已经 实现 IReadOnlyList 和 IReadOnlyDictionary。这意味着,你 可以直接将 List、T[] 或 Dictionary 的实例传递给 采用 IReadOnly 版本的 API。

【问题讨论】:

  • 好的,那为什么List<T> 会这样做呢?
  • 很奇怪。恕我直言,一个不一致的设计决定。见infoq.com/news/2011/10/ReadOnly-WInRT
  • @ColonelPanic 你误解了IReadOnlyCollection&lt;&gt; 的意图。大多数可变集合都实现了这个接口。它最酷的地方在于它是协变的。因此,如果您知道您将只从进入方法的集合中读取,则可以使该方法采用IReadOnlyCollection&lt;Animal&gt;。如果有人有List&lt;Giraffe&gt;,由于协方差,他们可以将其用作您的方法的输入。这真的很酷!
  • 有道理,很酷。所以 OP 问题的答案是“是的,ISet 应该实现 IReadOnlyCollection,这似乎是开发人员的疏忽”
  • 2015 年更新:已在 .NET 4.6 中修复

标签: c# .net collections .net-4.5


【解决方案1】:

在框架的 4.5 版本中,HashSet&lt;T&gt; 没有实现 IReadOnlyCollection&lt;out T&gt;

这个遗漏在框架的 4.6 版中得到解决(在提出上述问题近 12 个月后发布)。

这些更正是not limited to HashSet&lt;T&gt;,其他集合如Stack&lt;T&gt;Queue&lt;T&gt; 已收到这些改进。

关于任何遗漏的原因的猜测是没有实际意义的。这可能是疏忽或时间压力,但坦率地说,这没什么大不了的。我怀疑即使是来自 Microsoft 开发团队的直接意见也会有些主观,即使我们喜欢相关的轶事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多