我有这样的事情:
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
。
答案 0 :(得分:4)
从C#5规范,第3.5.3节:
当在声明它的类的程序文本之外访问受保护的实例成员时,并且当在声明它的程序的程序文本之外访问受保护的内部实例成员时,必须进行访问在一个类声明中,该声明派生自声明它的类。此外,需要通过该派生类类型的实例或从其构造的类类型进行访问。此限制可防止一个派生类访问其他派生类的受保护成员,即使成员是从同一基类继承的。
所以你可以访问任何Parent
对象的NodeDerived
属性:
NodeDerived derivedNode = ...;
Node parent = derivedNode.Parent;
...但无法访问Parent
属性,而不是NodeDerived
或子类的节点类型。
使用this.Parent
有效,因为this
的编译时类型为NodeDerived
。
我怀疑您希望将Parent
属性公开 - 假设您希望此代码与NodeDerived
以外的节点一起使用。