我对默认构造函数访问修饰符是什么感到困惑,这个MSDN状态说明是什么
If the direct base class does not have an accessible parameterless instance constructor, a compile-time error occurs.
因为当我用测试程序应用它时,它失败了。我可以创建一个继承另一个类的对象或类,但是没有定义外部无参数构造函数。
class A
{
}
class B : A
{
}
class C
{
public void main()
{
B objB = new B();// as per MSDN here should be the compile time error.
}
}
[Source]
答案 0 :(得分:3)
如果直接基类没有可访问的无参数 实例构造函数,发生编译时错误。
如果类的构造函数未定义,编译器将自动生成 public 默认构造函数。
答案 1 :(得分:2)
如果类不包含实例构造函数声明,则是默认值 实例构造函数自动提供。那个默认 构造函数只是调用direct的无参数构造函数 基类。如果直接基类没有可访问性 无参数实例构造函数,发生编译时错误。如果 该类是抽象的,然后是默认的声明可访问性 构造函数受到保护。否则,声明的可访问性为 默认构造函数是public。
在您的示例中,所有类A,B,C都是使用默认内部无参数构造函数创建的。
由于两个类都在同一个程序集中,并且默认情况下是内部构造函数,因此不会出现编译错误。但是,如果您在B类中声明不可访问的构造函数(例如私有或受保护),则会在示例中出现编译错误。
答案 2 :(得分:2)
如果您不自己创建一个无参数构造函数,编译器会创建无参数构造函数,因此根据MSDN页面,您的示例实际上最终看起来像这样;
class A
{
public A(): base() {}
}
class B : A
{
public B(): base() {}
}
您对new B()
的调用最终会调用A的构造函数。但是,如果您为A创建了一个私有的显式构造函数;
class A
{
private A() {}
}
class B : A
{
}
然后转换为;
class A
{
private A() {}
}
class B : A
{
public B(): base() {}
}
如果A的构造函数无法访问,则无法编译。
答案 3 :(得分:1)
如果没有为类定义构造函数,编译器将自动生成public
默认构造函数。
但是,如果有一个构造函数定义限制访问,那么编译器将抛出。
例如,这应该抛出异常:class A
{
private A() {}
}
class B : A
{
}
答案 4 :(得分:1)
Unless the class is static, classes without constructors are
given a public default constructor by the C# compiler in order to
enable class instantiation.