当IsReadOnly是接口成员时,List 如何使IsReadOnly成为私有的?

我正在创建一个专门的代理类来实现IList并包装一个内部的List实例。

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

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

它显式实现了接口成员。

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

请注意,这不会使接口成员成为private 。 它仍然是公开的,但只有当你通过界面查看对象时(使用强制转换)。

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

 bool IList.IsReadOnly { get { ... } } 

该成员仍可访问,但只能通过IList类型访问。

 List list = ...; bool isReadOnly = ((IList)list).IsReadOnly; 

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

对于ListIsReadOnly实际上没有意义:它总是false 。 因此List明确地实现ICollection (和IList )接口,从而使接口“私有”以供正常使用。 如果您还需要访问它,可以通过显式转换到界面:

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