为什么默认构造函数不会出现值类型?

下面的代码片段给出了一个类型的构造函数和方法列表。

static void ReflectOnType(Type type) { Console.WriteLine(type.FullName); Console.WriteLine("------------"); List constructors = type.GetConstructors(BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.Default).ToList(); List methods = type.GetMethods().ToList(); Type baseType = type.BaseType; while (baseType != null) { constructors.AddRange(baseType.GetConstructors(BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Default)); methods.AddRange(baseType.GetMethods()); baseType = baseType.BaseType; } Console.WriteLine("Reflection on {0} type", type.Name); for (int i = 0; i  0) { for (int j = 0; j  0) { Console.Write(", "); } Console.Write("{0} {1}", parameterInfos[j].ParameterType, parameterInfos[j].Name); } } Console.Write(")"); if (constructors[i].IsSpecialName) { Console.Write(" has 'SpecialName' attribute"); } Console.WriteLine(); } Console.WriteLine(); for (int i = 0; i < methods.Count; i++) { Console.Write("Method: {0}.{1}", methods[i].DeclaringType.Name, methods[i].Name); // Determine whether or not each field is a special name. if (methods[i].IsSpecialName) { Console.Write(" has 'SpecialName' attribute"); } Console.WriteLine(); } } 

但是当我将’int’类型传递给this方法时,为什么我在输出中看不到隐式构造函数? 或者,如何修改上面的代码以列出默认构造函数(如果我在代码中遗漏了某些内容)。

在C#(和大多数CLI语言)中 – 禁止在结构上指定无参数构造函数,因此,在C#(以及大多数其他.NET语言)中创建的结构甚至不会在IL中定义无参数构造函数。 CLR总是使用定义的规则初始化值类型(基本上,用等价零填充所有值),C#强制将其作为唯一选项。

由于默认情况下,无参数构造函数在C#生成的结构中不存在,因此在使用reflection时不会显示。

如果你想要任何构造函数,你可以得到构造函数列表

 var consturctorList = type.GetContructors(); 

如果你的值键入一个没有显式定义的构造函数的结构,你将获得一个空列表,因为隐式构造函数不能用于reflection它,你可以使用反序列化方法

 FormatterServices.GetUninitializedObject(Type type) 

这是C#和CLI规范之间的差异。 C#表示所有值类型都有一个(不可覆盖的)默认无参数构造函数,但CLI不是这种情况。

在许多情况下,运行时不会运行默认构造函数,即使它存在(这是合理的,因为大多数目标CIL的语言都不允许你写一个); 用零填充结构后什么都不做。 这是Jon Skeet 撰写的一篇有趣的文章 ,它试图将无参数构造函数入侵到结构中 – 它有时会运行,有时则不会运行,具体取决于上下文。

在任何情况下,reflectionAPI没有向您显示该类型上的这种无参数构造函数的原因是因为没有。