4

Why doesn't C# compiler simply call default implicit parameterless .ctor instead of intobj for null assigned nullable value types?

Lets say we have such as code:

Nullable<int> ex1 = new Nullable<int>();
Nullable<int> ex2 = null;
Nullable<int> ex3 = new Nullable<int>(10); 

The IL output for these two lines look like this:

enter image description here

It only call .ctor for last statement and why cannot we have the an instance for two first statements with zeroed fields?

4

3 回答 3

5

为什么 C# 编译器不简单地调用默认的隐式无参数.ctor而不是intobj为 null 分配的可为空值类型?

因为Nullable<T>(或任何其他值类型)实际上没有无参数构造函数。您可以通过在反编译器中查看它或使用反射(例如typeof(Nullable<>).GetConstructors())来验证它。

如果您在 C# 中new T()为某个值类型编写T代码,它看起来会调用无参数构造函数(C# 规范也将其称为构造函数),但实际情况并非如此,因为.ctor值类型上没有无参数方法。

于 2012-06-05T01:51:40.937 回答
1

为什么 C# 编译器不简单地调用默认的隐式无参数.ctor

因为像这样的值类型System.Nullable<T>不能包含显式的无参数构造函数;这是定义值类型的要求。因为值类型不能具有显式的无参数构造函数,initobj所以它是 CIL 中默认构造值类型的唯一方法。

于 2012-06-04T22:03:41.990 回答
0

因为根据MSDN 文档initobj,该指令初始化了一个值类型并将其字段清零或清零。在此之上调用默认构造函数方法不会提供额外的价值。您的最后一个示例传入一个值,因此称为一个非常具体的构造函数。

于 2012-06-04T22:04:38.593 回答