C# 为什么选择HashSet<;T>;不实施IReadOnlyCollection<;T>;?

C# 为什么选择HashSet<;T>;不实施IReadOnlyCollection<;T>;?,c#,.net,collections,.net-4.5,C#,.net,Collections,.net 4.5,我刚刚发现.NET Fx现在有3个有用的界面: 我有点困惑为什么不实现IReadOnlyCollection?有什么原因吗,或者微软又忘记了集合 UPD 在谷歌搜索了两个小时后,我发现BCL中有许多集合具有.Count属性,但没有实现IReadOnlyCollection接口 UPD2 我找到了这篇文章和Immo Landwerth的答案,他在下面说 除了列表和字典之外的其他收藏是否会更新到 支持这些接口? 当然。事实上,我们所有的内置集合类型 实现IReadOnlyList和IReadO

我刚刚发现.NET Fx现在有3个有用的界面:

  • 我有点困惑为什么不实现
    IReadOnlyCollection
    ?有什么原因吗,或者微软又忘记了集合

    UPD

    在谷歌搜索了两个小时后,我发现BCL中有许多集合具有
    .Count
    属性,但没有实现
    IReadOnlyCollection
    接口

    UPD2

    我找到了这篇文章和Immo Landwerth的答案,他在下面说

    除了列表和字典之外的其他收藏是否会更新到 支持这些接口?

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


    在框架的4.5版中,未实现
    IReadOnlyCollection

    该框架的4.6版(在提出上述问题近12个月后发布)解决了这一遗漏

    这些更正是,其他收藏,如和,已收到这些改进


    关于任何遗漏的原因的猜测都是没有意义的。这可能是疏忽或时间压力,但坦率地说,这没有什么后果。我怀疑,即使我们喜欢相关的趣闻轶事,微软开发团队的直接投入也会有点主观。

    好吧,那为什么呢?奇怪。Imho,一个不一致的设计决策。请参见@ColonelPanic您误解了
    IReadOnlyCollection
    的意图。大多数可变集合实现此接口。最酷的是它是协变的。因此,如果您知道只从进入方法的集合中读取,可以使该方法采用
    IReadOnlyCollection
    。如果有人有一个
    列表
    ,由于协方差的原因,他们可以将其用作方法的输入。太酷了!有道理,酷。因此OP的问题的答案是“是的,我认为IT应该实施IReadOnlyCollection,这似乎是开发人员的疏忽,2015年更新:在.NET 4.6中修复