我想知道为什么会抛出异常(在执行时):
IAgentIndicator iai = (IAgentIndicator)Activator.CreateInstance(agentIndicatorType);
当我有一个带默认参数的构造函数时(但是当我没有创建构造函数public foo()
时:
public class foo : IAgentIndicator
{
public foo(int a = 0, int b = 0)
{
}
}
编译时是否生成无参数构造函数?
答案 0 :(得分:7)
这里有两个问题:
只有在您自己没有定义任何构造函数时,才会自动为您生成无参数构造函数。显然,这不是这种情况,因为你手动声明了一个构造函数。
可选参数只是呼叫点的编译时语法糖。参数化构造函数不算作无参数构造函数,即使其所有参数都是可选的。
答案 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)
答案 4 :(得分:1)
根据c#的语言规范:
如果类不包含实例构造函数声明,则会自动提供默认实例构造函数。该默认构造函数只是调用直接基类的无参数构造函数。如果直接基类没有可访问的无参数实例构造函数,则会发生编译时错误。
由于您的类foo包含实例构造函数,因此不会生成默认构造函数。您需要声明自己的。