繁体   English   中英

无法访问同一基类的受保护成员

[英]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工作,因为在编译时类型thisNodeDerived

我怀疑您会希望公开您的Parent属性-假设您希望此代码与NodeDerived以外的节点NodeDerived

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM