这
var h = new HashSet<int>();
var r = h.IsReadOnly;
不编译。我要做
var r = ((ICollection<int>)h).IsReadOnly;
为什么 IsReadOnly 没有正常实施?
(我不是问如何,而是为什么)
这
var h = new HashSet<int>();
var r = h.IsReadOnly;
不编译。我要做
var r = ((ICollection<int>)h).IsReadOnly;
为什么 IsReadOnly 没有正常实施?
(我不是问如何,而是为什么)
我猜是因为,虽然 HashSet 实现了 ICollection,但 IsReadOnly 对 HashSet 没有任何意义。事实上,如果你反映它,该属性总是返回false。显式实现它会在公共接口中隐藏此方法。
另一个原因是,ICollection 接口的实现可能是由于偶然的原因(例如,为了支持 xaml 序列化),而不是因为它对于类的主要使用是必需的。因此,显式地实现它可以避免类接口的混乱。
使用显式接口实现的原因基本上有两个(来源:MSDN):
对于HashSet<T>
,后一种情况适用,因为哈希集永远不会是只读的,IsReadOnly
因此将始终返回false
。