【问题标题】:How does List<T> make IsReadOnly private when IsReadOnly is an interface member?当 IsReadOnly 是接口成员时,List<T> 如何将 IsReadOnly 设为私有?
【发布时间】:2010-10-23 07:52:52
【问题描述】:

我正在创建一个实现 IList&lt;T&gt; 并包装内部 List&lt;T&gt; 实例的专用代理类。

List&lt;T&gt; 本身实现了IList&lt;T&gt;,它声明了一个成员bool IsReadOnly,但是当我尝试从我自己的类中访问该成员时,我不能,因为在List&lt;T&gt; 中,IsReadOnly是私人的。

所以我的问题是;如果接口的实现要求所有实现的成员都是公共的,为什么List&lt;T&gt; 将 IsReadOnly 实现为私有,从而拒绝我访问它?

【问题讨论】:

  • 谢谢大家,所有三个答案都很有帮助:)
  • 很好的答案。接下来——为什么? ;^)

标签: c# .net


【解决方案1】:

它显式地实现了接口成员。

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

请注意,这不会使接口成员private。它仍然可以公开使用,但前提是您通过界面查看对象(使用强制转换)。

【讨论】:

  • 这让我大吃一惊。 edit:我刚刚意识到这就是我们解决“两个接口具有相同方法”问题的方法。现在我觉得很傻。我从没想过使用显式实现作为方法隐藏的一种形式。 #dotnetisawesome
【解决方案2】:

它能够做到这一点的原因是它使用显式接口实现。

bool IList<T>.IsReadOnly { get { ... } }

此成员仍可访问,但只能通过 IList&lt;T&gt; 类型访问。

List<T> list = ...;
bool isReadOnly = ((IList<T>)list).IsReadOnly;

在实现IList&lt;T&gt; 时,该类型本身并未承诺提供 IsReadOnly 值。相反,它承诺在被视为IList&lt;T&gt; 时提供 IsReadOnly 属性。它是否在实际类中提供它纯粹是类型作者的选择。

【讨论】:

  • @JaredPar:你不能在 EII 上声明访问修饰符。
  • @Mehrdad,是的,我倒退了很多。 VB 和 C# 在这里有不同的行为。
【解决方案3】:

如果List&lt;T&gt;IsReadOnly 真的没有意义:它总是falseList 因此显式实现了ICollection&lt;T&gt;(和IList)接口,从而使接口“私有”以供正常使用。如果您仍然需要访问它,您可以通过显式转换到接口:

bool result = ((ICollection<string>)yourStringList).IsReadOnly;
// Or equivalently using `IList`.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多