The reason this doesn't work is because C# doesn't allow cross-hierarchy calling of protected methods. Say there was a class E
that also derived from C
:
C
/
D E
Then the reference you're trying to call the method on could actually be an instance of type E
and thus the method could resolve at runtime to E.F
. This is not permitted in C# as D
cannot call E
's protected methods, because E
is in another branch of the hierarchy, i.e.
var d = new D();
var e = new E();
d.G(e); // oops, now this will call E.F which isn't allowed from D
This makes sense because the keyword protected
means the member "is accessible within its class and by derived class instances" and E.F is not a member of D.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…