为什么我们不能使用GetConstructor找到Int32的默认构造函数?

Ael*_*eis 6 c# reflection

在C#中我们可以这样做:

Int32 i = new Int32();
Run Code Online (Sandbox Code Playgroud)

但是,以下内容将返回null:

typeof(Int32).GetConstructor(new Type[0])
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

我检查了文档,没有找到解决这个问题的原因.

我的结果可以在下面的代码中说明:

using System;

public class Program
{
    public static void Main()
    {
        Int32 i = new Int32();
        Console.WriteLine(i);
        Console.WriteLine(typeof(Int32).GetConstructor(new Type[0]) == null);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

0

真正

Ael*_*eis 5

阿列克谢莱文科夫在评论中发表了一个非常好的答案,所以我决定采取内容并解释他们回答我的问题.参考原始问答.

它有点厚,但这里是答案:

结构不一定具有无参数构造函数.它们可以有一个,但C#不发出一个,编译器不需要一个.C#标准讨论了所有具有"隐式公共参数构造函数,称为默认构造函数"的值类型,但它随后指出生成构造函数调用不需要实现,并且调用就像它们是构造函数一样,尽管它们不是必然是建设者.

反射可能找不到构造函数方法的原因是因为它实际上不存在.CLR将允许您在没有构造函数的情况下实例化,并填充对象包含的内存位置.

更新:我想注意Jon Skeet 在这里也回答了与此相关的问题