【发布时间】:2012-08-04 16:44:59
【问题描述】:
我刚刚发现 .NET Fx 现在有 3 个有用的接口:
我有点困惑为什么HashSet<T> 不实现IReadOnlyCollection<T>?有什么原因,还是微软又忘记了集合?
UPD
经过两个小时的谷歌搜索,我发现 BCL 中有很多集合具有.Count 属性但没有实现IReadOnlyCollection<T> 接口。
UPD2
我找到了这篇帖子 http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b4fb991a-3f5c-4923-93d4-7cd5c004f859 和 Immo Landwerth 的回答,他说如下
除了 List 和 Dictionary 之外的其他集合是否会更新为 支持这些接口吗?
当然。事实上,我们所有的内置集合类型已经 实现 IReadOnlyList 和 IReadOnlyDictionary。这意味着,你 可以直接将 List、T[] 或 Dictionary 的实例传递给 采用 IReadOnly 版本的 API。
【问题讨论】:
-
好的,那为什么List<T> 会这样做呢?
-
很奇怪。恕我直言,一个不一致的设计决定。见infoq.com/news/2011/10/ReadOnly-WInRT
-
@ColonelPanic 你误解了
IReadOnlyCollection<>的意图。大多数可变集合都实现了这个接口。它最酷的地方在于它是协变的。因此,如果您知道您将只从进入方法的集合中读取,则可以使该方法采用IReadOnlyCollection<Animal>。如果有人有List<Giraffe>,由于协方差,他们可以将其用作您的方法的输入。这真的很酷! -
有道理,很酷。所以 OP 问题的答案是“是的,ISet 应该实现 IReadOnlyCollection,这似乎是开发人员的疏忽”
-
2015 年更新:已在 .NET 4.6 中修复
标签: c# .net collections .net-4.5