[英]Can't access protected member of the same base class
我有这样的事情:
class Node
{
protected Node Parent
{
get; private set;
}
}
class NodeDerived : Node
{
void SomeMethod()
{
Node parentIterator = this.Parent;
while (parentIterator != null)
{
// ... some logic
parentIterator = parentIterator.Parent; // Here's the error
}
}
}
但是由于某些奇怪的原因,我无法访问parentIterator.Parent
属性:
error CS1540: Cannot access protected member `Node.Parent' via a qualifier of type `Node'. The qualifier must be of type `NodeChild' or derived from it
为什么会这样呢? 顺便说一句,我还发现虽然我可以访问this.Parent
,但是我却无法访问((Node) this).Parent
。
根据C#5规范的第3.5.3节:
当在声明了该实例的类的程序文本之外访问受保护的实例成员时,以及当在声明该实例的程序的程序文本之外访问受保护的内部实例成员时,访问必须在一个类内进行从声明它的类派生的声明。 此外,需要通过该派生类类型的实例或从其构造的类类型的实例进行访问。 此限制可防止一个派生类访问其他派生类的受保护成员,即使成员是从同一基类继承的也是如此。
因此,您可以访问任何NodeDerived
对象的Parent
属性:
NodeDerived derivedNode = ...;
Node parent = derivedNode.Parent;
...但是您不能访问不是NodeDerived
或子类的节点类型的Parent
属性。
使用this.Parent
工作,因为在编译时类型this
是NodeDerived
。
我怀疑您会希望公开您的Parent
属性-假设您希望此代码与NodeDerived
以外的节点NodeDerived
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.