默认构造函数的访问修饰符是什么?

4

我对默认构造函数的访问修饰符感到困惑,不明白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]


5
B具有自动生成的公共默认构造函数。 - pasztorpisti
那么你的意思是,如果我在B中将无参构造函数设为私有,则只会出现编译时错误。 - NoviceToDotNet
可能是什么是C#中的默认访问修饰符?的重复问题。 - O. R. Mapper
1
但是Jon Skeet回答的另一个链接说,C#中所有内容的默认访问权限都是“您可以为该成员声明的最受限制的访问权限”。这与此MSDN链接相矛盾。 - NoviceToDotNet
如果一个类是 internal 的,那么它的默认构造函数也是 public 的。 - NoviceToDotNet
@NoviceToDotNet:我撤回了我的关闭投票。我刚刚意识到这个问题实际上是关于“((默认构造函数)访问修饰符)”而不是“(默认(构造函数访问修饰符))”。 - O. R. Mapper
5个回答

4

如果直接基类没有可访问的无参实例构造函数,则会发生编译时错误。

如果一个类没有定义构造函数,编译器将自动生成一个公共的默认构造函数。


3

来自使用构造函数

Unless the class is static, classes without constructors are 
given a public default constructor by the C# compiler in order to 
enable class instantiation.

3
编译器会创建一个无参构造函数,如果你没有自己创建的话。因此根据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
如果一个类没有实例构造函数声明,将自动提供默认实例构造函数。该默认构造函数只是调用直接基类的无参构造函数。如果直接基类没有可访问的无参实例构造函数,则会发生编译时错误。如果该类是抽象的,则默认构造函数的声明可访问性为protected。否则,默认构造函数的声明可访问性为public。
在您的示例中,所有类A、B、C都已创建了一个默认的内部无参构造函数。
由于两个类在同一个程序集中,并且默认情况下都是具有内部构造函数的内部类,因此您不会收到编译错误。但是,如果您在类B中声明一个不可访问的构造函数(例如private或protected),则会在您的示例中出现编译错误。

如果基类中有任何一个私有构造函数,那么 A->B->C 将在编译时出现错误。 - NoviceToDotNet
如果一个类是 internal 的,那么它的默认构造函数也是 public 的吗? - NoviceToDotNet
@NoviceToDotNet:我已经更新了我的回答,因为之前并不完全正确。 - Rafa Paez

2

如果一个类没有定义构造函数,编译器将自动生成一个public默认构造函数。

然而,如果已经定义了一个限制访问的构造函数,那么编译器将会抛出异常。

例如,下面的代码将会抛出异常:

class A
{
   private A() {}
}
class B : A
{
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接