为什么 HashSet<T>.IsReadOnly 是显式的?
-
09-09-2019 - |
题
这
var h = new HashSet<int>();
var r = h.IsReadOnly;
不编译。我要做
var r = ((ICollection<int>)h).IsReadOnly;
为什么IsReadOnly没有正常实现?
(我不是问 如何, , 但 为什么)
解决方案
我猜它,因为当HashSet的实现ICollection的,IsReadOnly有HashSet的没有意义。事实上,如果你反映它的属性始终返回false。明确地实现它隐藏了公共接口这种方法。
的另一个原因是因为ICollection接口可能由于偶然原因来实现(例如,以支持XAML序列),而不是因为它的必要的主要用途的类。因此,实现它明确地可以保持混乱了类的接口。
其他提示
基本上有两个原因导致您求助于显式接口实现(来源: 微软软件定义网络):
- 您使用包含相同签名的成员实现多个接口,并且您希望这些成员具有不同的行为。
- 接口成员对于类来说并不是特别感兴趣,但是为了通过接口引用对象是必需的。
为了 HashSet<T>
, ,后一种情况适用,因为哈希集永远不是只读的并且 IsReadOnly
因此总会返回 false
.
不隶属于 StackOverflow