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

时间:2014-02-28 10:12:05

标签: c#

我对默认构造函数访问修饰符是什么感到困惑,这个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 个答案:

答案 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)

来自Using Constructors

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