C# 为什么我会得到一个;由于保护级别而无法访问”;错误?
我得到这个错误: “CTest.A.A()”由于其保护级别而不可访问 编译此代码时: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的默认构造函数
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派生的类,情况也是如此。)