我试图通过获取和调用它的无参数构造函数来创建一个结构体的实例,该结构体的数据类型在编译时未知。下面的代码片段显示了我所做的工作:
var i = new System.Int32();
var type = i.GetType();
var constructor = type.GetConstructor(System.Type.EmptyTypes);
var value = constructor.Invoke(null);
这不起作用,因为type.GetConstructor(System.Type.EmptyTypes)
返回null
。当我逐步完成这一步时,我可以看到type
肯定是 System.Int32
,并且从第一行可以明显看出,有一个无参数构造函数。那么为什么我无法获得它呢?
我尝试用用户定义的结构来排除内置类型限制的可能性,但显示相同的行为。
不需要调用结构体的无参数构造函数。只使用激活器进行创建:
Activator.CreateInstance(i.GetType());
不能获得结构体的无参数构造函数的原因是它根本不存在。
第一行正常运行并不意味着存在构造函数。它被编译为initobj
指令(它只是将内存空间归零),或者甚至(取决于上下文,特别是int
的情况)只编译为ldc.i4.0
。