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

时间:2014-01-30 12:59:56

标签: c# mono access-modifiers

我有这样的事情:

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

1 个答案:

答案 0 :(得分:4)

从C#5规范,第3.5.3节:

  

当在声明它的类的程序文本之外访问受保护的实例成员时,并且当在声明它的程序的程序文本之外访问受保护的内部实例成员时,必须进行访问在一个类声明中,该声明派生自声明它的类。此外,需要通过该派生类类型的实例或从其构造的类类型进行访问。此限制可防止一个派生类访问其他派生类的受保护成员,即使成员是从同一基类继承的。

所以你可以访问任何Parent对象的NodeDerived属性:

NodeDerived derivedNode = ...;
Node parent = derivedNode.Parent;

...但无法访问Parent属性,而不是NodeDerived或子类的节点类型。

使用this.Parent有效,因为this的编译时类型为NodeDerived

我怀疑您希望将Parent属性公开 - 假设您希望此代码与NodeDerived以外的节点一起使用。