C#List <t>隐藏属性?</t>

时间:2011-09-23 04:45:24

标签: c# member-hiding

  

可能重复:
  How does List<T> make IsReadOnly private when IsReadOnly is an interface member?

好的,这让我疯了。 List<T>实施IList<T>。然而,

IList<int> list = new List<int>();
bool b = list.IsReadOnly;
bool c = ((List<int>)list).IsReadOnly;    // Error

错误是:

  

'System.Collections.Generic.List'不包含'IsReadOnly'的定义,并且没有扩展方法'IsReadOnly'接受类型为'System.Collections.Generic.List'的第一个参数'(你丢失了吗?) using指令或程序集引用?)

这怎么可能?这是否违反了我们告诉所有人的规则,关于不隐藏会员?这里的实施细节是什么?

4 个答案:

答案 0 :(得分:5)

因为实现是通过显式接口实现的。

意思是它被定义为

bool IList<T>.IsReadOnly { get; set; //etc }

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

这就是为什么它不在List之外。

答案 1 :(得分:1)

List<T>显式实现IList<T>,因此您必须先将对象强制转换为接口,然后才能访问IsReadOnly。来自MSDN:

  

实现接口的类可以显式实现成员   那个界面。当成员明确实现时,它不能   可以通过类实例访问,但只能通过实例访问   界面

答案 2 :(得分:0)

如果查看List类,您会看到:

 bool IList.IsReadOnly { [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
        get; }

所有真正相关的是IsReadOnly是使用显式实现声明的,这意味着只有在将对象声明为IList的对象时才能看到属性。

答案 3 :(得分:0)

显式接口实现,如:

bool IList<T>.IsReadOnly { get; }