为什么这不会创建默认构造函数?

时间:2016-03-27 17:05:57

标签: c# constructor

我想知道为什么会抛出异常(在执行时):

IAgentIndicator iai = (IAgentIndicator)Activator.CreateInstance(agentIndicatorType);

当我有一个带默认参数的构造函数时(但是当我没有创建构造函数public foo()时:

public class foo : IAgentIndicator
{
    public foo(int a = 0, int b = 0)
    {
    }
}

编译时是否生成无参数构造函数?

5 个答案:

答案 0 :(得分:7)

这里有两个问题:

  1. 只有在您自己没有定义任何构造函数时,才会自动为您生成无参数构造函数。显然,这不是这种情况,因为你手动声明了一个构造函数

  2. 可选参数只是呼叫点的编译时语法糖。参数化构造函数不算作无参数构造函数,即使其所有参数都是可选的

答案 1 :(得分:4)

  

编译时是否生成无参数构造函数?

正如其他人所说,只有你自己没有提供带有参数的构造函数实现时,才会生成默认构造函数。

From the specification(§10.10.4)(强调我的):

  

如果某个类不包含实例构造函数声明,则为默认值   实例构造函数是自动提供的。那个默认   构造函数只是调用direct的无参数构造函数   基类。如果直接基类没有可访问性   无参数实例构造函数,发生编译时错误。

如果您在IL中查看类型的签名,您将看到它创建了一个带有两个参数的构造函数,这些参数使用[opt]标记进行注释并具有默认值:

.method public hidebysig specialname rtspecialname 
instance void .ctor (
    [opt] int32 a,
    [opt] int32 b
) cil managed 
{
    .param [1] = int32(0)
    .param [2] = int32(0)
    // Method begins at RVA 0x207c
    // Code size 9 (0x9)
    .maxstack 8

    IL_0000: ldarg.0
    IL_0001: call instance void [mscorlib]System.Object::.ctor()
    IL_0006: nop
    IL_0007: nop
    IL_0008: ret
} // end of method foo::.ctor

这不是Activate.CreateInstance期望的空构造函数。

答案 2 :(得分:2)

  

不是在编译时生成的无参数构造函数

仅生成DEFAULT无参数构造函数,未定义构造函数。可以在语言规范中阅读。

答案 3 :(得分:2)

  

如果类不包含实例构造函数声明,则会自动提供默认实例构造函数。

因此,如果有构造函数.net将不会创建另一个无参数构造函数。

请参阅the documentation

答案 4 :(得分:1)

根据c#的语言规范:

  

如果类不包含实例构造函数声明,则会自动提供默认实例构造函数。该默认构造函数只是调用直接基类的无参数构造函数。如果直接基类没有可访问的无参数实例构造函数,则会发生编译时错误。

由于您的类foo包含实例构造函数,因此不会生成默认构造函数。您需要声明自己的。