我不明白下面显示的可访问性限制

public abstract class Base { }
internal class Common : Base { }
public class Instance : Common { }


这不会编译。


  可访问性不一致:基类“ Common”的访问性比类“ Instance”的访问性小


我可以使用公共抽象类Common来完成我想要的操作,但是为什么我根本不能完全不公开该名称呢?

编辑:我要问的是为什么它以这种方式工作!每个人都在回答规则是什么,而不是解释为什么规则是那样。

最佳答案

类的继承者不能扩大基类的可访问范围。


  公共:访问不受限制
  内部:仅限此程序访问


一旦受限于该程序,internal class的所有继承者都必须保持internal或承担较小的可访问性(protected internalprivate)。

根据C# specification节§3.5.4可访问性限制:


  实例构造函数的参数类型必须至少为
  作为实例构造函数本身可以访问。
  
  在这个例子中

class A {...}

public class B: A {...}

  
  B类导致编译时错误,因为A至少不是
  与B一样可访问。


也:


  类类型的直接基类必须至少具有可访问性
  作为类类型本身(第3.5.2节)。例如,这是一个编译时
  公共类从私有类或内部类派生的错误。


如果您尝试创建具有某些功能的Common类,而不希望外部代码无法访问该类,则应prefer composition over inheritance。例如:

public abstract class Base
{
...
}

internal class Common : Base
{
...
}

public class Instance
{
    internal Instance(Common common)
    {
        ...
    }
...
}

关于c# - 为什么我不能有一个继承自内部类的公共(public)类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8738180/

10-09 18:08
查看更多