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

时间:2014-09-15 01:18:45

标签: c# reflection

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

Int32 i = new Int32();

但是以下内容将返回null

typeof(Int32).GetConstructor(new Type[0])

为什么会这样?

我检查了documentation并没有找到解决这个问题的原因。

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

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);
    }
}

输出结果为:

  

0

     

1 个答案:

答案 0 :(得分:5)

Alexei Levenkov在评论中发表了一个非常好的答案,所以我决定采取内容并解释他们回答我的问题。 Reference to original Q & A

它有点厚,但这是答案:

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

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

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