【问题标题】:Why is HashSet<T>.IsReadOnly explicit?为什么 HashSet<T>.IsReadOnly 是显式的?
【发布时间】:2010-10-19 02:44:08
【问题描述】:

这个

var h = new HashSet<int>();
var r = h.IsReadOnly;

不编译。我必须这样做

var r = ((ICollection<int>)h).IsReadOnly;

为什么 IsReadOnly 没有正常实现?

(我不是在问如何,而是为什么

【问题讨论】:

    标签: c# interface hashset icollection explicit-interface


    【解决方案1】:

    我猜是因为,虽然 HashSet 实现了 ICollection,但 IsReadOnly 对 HashSet 没有任何意义。事实上,如果你反映它,该属性总是返回false。显式实现它会在公共接口中隐藏此方法。

    另一个原因是,ICollection 接口的实现可能是出于偶然的原因(例如,支持 xaml 序列化),而不是因为它对类的主要使用是必需的。因此,显式地实现它可以避免类接口的混乱。

    【讨论】:

    • 啊,是的,这确实有道理。 HashSet 也会隐藏 IsReadOnly ,原因与我猜想的相同,因此如果您尝试使用它,则会出现编译错误。
    • 顺便说一句,你不需要为xaml序列化实现ICollection;集合必须实现 IDictionary 或 IList。这只是您可能出于偶然原因需要实现接口的情况的一个示例。
    【解决方案2】:

    使用显式接口实现基本上有两个原因(来源:MSDN):

    1. 您使用包含相同签名的成员实现多个接口,并且希望这些成员具有不同的行为。
    2. 接口成员对类来说不是特别感兴趣,但它是接口引用对象所必需的。

    对于HashSet&lt;T&gt;,后一种情况适用,因为哈希集永远不会是只读的,因此IsReadOnly 将始终返回false

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 2012-08-04
      • 2021-02-08
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      相关资源
      最近更新 更多