为什么可以';t我有一个从内部类继承的公共类

本文关键字:继承 内部类 有一个 为什么 | 更新日期: 2023-09-27 18:19:33

我不理解下面显示的可访问性限制

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

这不会编译。

可访问性不一致:基类"Common"的可访问性低于类"Instance"

我可以用公共抽象类Common实现我想要的,但为什么我不能简单地不公开名称呢?

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

为什么可以';t我有一个从内部类继承的公共类

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

public:访问不受限制内部:限制访问此程序

一旦被限制为程序,则a、internal class的所有继承者必须保持internal或具有较小的可访问性(protected internalprivate)。

根据C#规范,§3.5.4节可访问性约束

实例构造函数的参数类型必须至少为可作为实例构造函数本身访问。

在示例中

class A {...}
public class B: A {...}

B类导致编译时错误,因为a不是与B.一样可访问

还有:

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

如果您试图创建一个Common类,该类具有您不希望外部代码访问的功能,那么您应该更喜欢组合而不是继承。例如:

public abstract class Base
{
...
}
internal class Common : Base
{
...
}
public class Instance
{
    internal Instance(Common common)
    {
        ...
    }
...
}

这取决于代码对其他程序集的可见性。通过将Common设置为内部,您将限制对其程序集的Common访问,而通过将Instance设置为公共,您将使任何引用程序集都可以访问Instance。如果引用程序集不能访问类型的基类,它如何访问从该基类继承的任何成员?

如果Common包含属性,比如Foo:

public string Foo { get; set; }

则CCD_ 8类将自动公开该属性。你可以这样想:

public void Test()
{
    Common myInstance = new Instance();
    System.Console.WriteLine(myInstance.Foo);
}

由于Instance需要公开Common所拥有的所有内容,因此基类上的访问修饰符不能少公开。

但是,您可以将属性Foo创建为内部属性,以实现大致相同的功能。