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

7
在C#中,我们可以这样做:
Int32 i = new Int32();

然而,以下代码将返回null
typeof(Int32).GetConstructor(new Type[0])

为什么会这样呢?

我查看了文档,但没有找到为什么会发生这种情况的线索。

下面的代码片段可以说明我的结果:

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

The output is :

0

True


1
请查看以下网址:http://forums.asp.net/t/1268224.aspx?using+reflection+with+primitive+data+types+。 - Alexei Levenkov
@AlexeiLevenkov,这是一篇不错的文章,你应该把它发表为答案。 - Aelphaeis
也许可以。你可以自由地从那个链接中得出答案,我会很高兴地点赞...或者尝试搜索现有的SO答案来解决它(但我没有找到...) - Alexei Levenkov
这篇文章包含了一些关于值类型的好信息,以及为什么它们实际上没有构造函数。这就是为什么你在反射中很难找到一个构造函数的原因。 - OxCantEven
@AlexeiLevenkov,我在提问之前进行了搜索;但是,我已经将你提供的链接中的答案撰写成了这里的一个答案。 - Aelphaeis
1个回答

6

Alexei Levenkov在评论中发表了一篇非常好的答案,因此我决定采用其中的内容并进行改述来回答我的问题。原始问答的参考链接

结构体并不一定有无参数的构造函数。它们可以有一个,但C#不会发出一个,并且编译器不需要一个。C#标准谈到所有值类型都有“隐式公共无参数构造函数称为默认构造函数”,但随后指出实现不需要生成构造函数调用,并且这些调用工作方式就像它们是构造函数一样,尽管它们不一定是构造函数。

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

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


另一种看待这个问题的方式是,在C#中,int确实有一个默认构造函数,但在.Net中却没有。 - svick
+1. @Aelphaeis 感谢您抽出时间撰写总结。请考虑将其接受为答案。并且请考虑添加链接到Jon Skeet的帖子,该帖子由Dex发现 - 为什么无法为int定义默认构造函数,该帖子涵盖了相同的主题。 - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接