为什么可以';从C#中的子类访问受保护的方法吗?

为什么可以';从C#中的子类访问受保护的方法吗?,c#,inheritance,C#,Inheritance,为什么我不能从C#中的子类访问受保护的方法 类别: public abstract class A { protected void Method() { } } 子类: public class B : A { } 控制台应用程序: B b = new B(); b.Method(); 编译器说: 错误1“Method()”由于其保护级别而不可访问受保护并不意味着客户端代码可以通过派生类实例访问它 它并不意味着派生类代码可以使用它。例如,这将是有效的: pu

为什么我不能从C#中的子类访问受保护的方法

类别:

public abstract class A
{
    protected void Method()
    {

    }
}
子类:

public class B : A
{

}
控制台应用程序:

B b = new B();

b.Method();
编译器说:
错误1“Method()”由于其保护级别而不可访问

受保护
并不意味着客户端代码可以通过派生类实例访问它

并不意味着派生类代码可以使用它。例如,这将是有效的:

public class B : A
{
     public void SomeMethod()
     {
          Method();
     }
}

如果您希望您的确切代码示例正常工作,请将
方法标记为
公共

谢谢您的回复,但是您能告诉我为什么它会这样吗?根据MSDN文档,“类型或成员只能由同一类或结构中的代码访问,或由该类派生的类中的代码访问。”这是非常微妙的。是否有比MSDN文档更深入的阅读资料?(对不起,我按了Enter键,它很早就提交了我的评论。)@TheCog,因为这是受保护的访问修饰符的规则。对于它的价值,它在C++中是一样的。这只是该关键字作用的定义。根据相同的MSDN文档(),在类和结构可访问性下:“派生类的可访问性不能大于其基类型。换句话说,您不能拥有从内部类a派生的公共类B。如果允许这样做,则会产生公开的效果,因为a的所有受保护或内部成员都可以从派生类访问。“这些信息帮助我理解了你的答案。谢谢。此外,我相信这将是一个很好的使用公共方法(如建议的)或公共虚拟方法的方法,这样我就可以在必要时在子类中重写它。@这里的微妙之处在于,代码在哪里很重要。类定义中的代码可以访问受保护的
成员,但仅使用类的外部随机代码不能访问。我是在学校学的,所以恐怕我不知道有什么在线的超级棒的解释:(