C# 为什么我会得到一个;由于保护级别而无法访问”;错误?

C# 为什么我会得到一个;由于保护级别而无法访问”;错误?,c#,.net,constructor,access-modifiers,C#,.net,Constructor,Access Modifiers,我得到这个错误: “CTest.A.A()”由于其保护级别而不可访问 编译此代码时: public class A { private A() { } } public class B : A { public void SayHello() { Console.WriteLine("Hello"); } } 有人能解释一下原因吗?因为A的默认构造函数是私有的,请尝试将受保护的A(){}作为构造函数 类B自动调用A的默认构造函数

我得到这个错误:

“CTest.A.A()”由于其保护级别而不可访问

编译此代码时:

public class A
{
    private A()
    {
    }
}

public class B : A
{
    public void SayHello()
    {
        Console.WriteLine("Hello");
    }
}

有人能解释一下原因吗?

因为A的默认构造函数是私有的,请尝试将
受保护的A(){}
作为构造函数

B
自动调用
A
的默认构造函数,如果
B
无法访问该构造函数,或者没有默认构造函数(如果您有受构造函数
保护的A(字符串s){}
B
无法正确实例化

编译器在
B

public B() : base()
{
}

其中
base()
是对
A

的默认构造函数的实际调用,这是因为A的构造函数是私有的,而B的构造函数是公共的。构造B(也构造A)时,无法访问A的私有构造函数。

B
上的构造函数(由编译器添加)需要调用
A
上的默认(无参数)构造函数,但是默认构造函数标记为
private
,这意味着它只能在
A
内部调用,因此会出现错误


A
上的构造函数更改为
protected
public
,或
internal
如果
B
位于同一程序集中。

A的构造函数是私有的,不能从外部访问。如果您想从外部创建A的实例,请将构造函数设置为公共的或受保护的。

private A()
更改为
public A()
,您就可以开始了。

B的构造函数是公共的与任何事情有什么关系?您将如何使用private构造函数实例化B?我刚刚指出B可以实例化你可以在B上使用一个静态工厂方法调用B的私有构造函数(需要调用a的公共或受保护构造函数),谁说了实例化?编译器错误与B的ctor被公开无关,但也不是全部。即使B是一个抽象类,您也会得到相同的编译错误。抽象类没有构造函数,但编译器仍然强制执行该规则,因为从B派生的类C也会有同样的问题。(请注意,即使没有从C派生的类,情况也是如此。)