为什么 HashSet<T> 没有实现 IReadOnlyCollection<T> 接口?

16
我刚刚发现.NET Fx现在有3个有用的接口:
  1. IReadOnlyCollection<T>
  2. IReadOnlyList<T>
  3. IReadOnlyDictionary<K,V>
但我有点困惑为什么HashSet<T>没有实现IReadOnlyCollection<T>?是否有任何原因,或者微软只是再次忘记了集合?
更新:
经过两个小时的谷歌,我发现BCL中有许多集合具有.Count属性,但不实现IReadOnlyCollection<T>接口。
更新2:
我找到了这篇文章http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b4fb991a-3f5c-4923-93d4-7cd5c004f859Immo Landwerth的回答,他说:

好的,那么为什么要使用 List<T> 呢? - hazzik
12
@ColonelPanic,您误解了IReadOnlyCollection<>的意图。大多数可变集合都实现了这个接口。它的酷之处在于它是协变的。因此,如果您知道您将只从一个集合中读取数据,该集合将被传递到一个方法中,您可以使该方法接受一个IReadOnlyCollection<Animal>。如果某人有一个List<Giraffe>,他们可以因为协变而将其用作您方法的输入。这真是太棒了! - Jeppe Stig Nielsen
10
2015年更新:已在.NET 4.6中修复。 - Colonel Panic
@JeppeStigNielsen 如果接口被命名为IReadableCollection会很酷。以一种与其使用方式完全不合逻辑的方式命名某物是不酷的。 - jpmc26
@jpmc26 我同意这里有一些令人困惑的命名。如果你有一个 List<> 实例并在其上使用 .AsReadOnly(),你会得到一个_包装器_,它不会让你修改列表(其他人可以修改它,所以它并不是真正的不可变)。那个包装类被称为 ReadOnlyCollection<>。所以“只读”在这里用了另一种意义。我有点喜欢你的 IReadableCollection<> 的想法。然而,现在更改这些令人困惑的名称为时已晚。 - Jeppe Stig Nielsen
显示剩余2条评论
1个回答

16
在框架的4.5版本中,HashSet<T> 没有实现 IReadOnlyCollection<out T> 接口。
在发布上述问题近12个月后,这一遗漏在框架的4.6版本中得到了修复。
这些更改不仅限于 HashSet<T>,其他集合(如Stack<T>Queue<T>)也已经接受了这些改进。
对于任何遗漏原因的猜测都没有意义。可能是疏忽或时间压力,但实际上这并不重要。我怀疑即使我们享受相关轶事,来自Microsoft开发团队的直接输入也会有点主观。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接