c# – 使用IL中的Initobj操作码初始化可空类型

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

让我们说我们有代码:

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

这两行的IL输出如下所示:

它只调用.ctor作为最后一个语句,为什么我们不能拥有两个带有归零字段的第一个语句的实例?

解决方法:

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

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

如果你在C#中为某个值类型T编写新的T(),它看起来像是调用无参数构造函数(并且C#规范也将它称为构造函数),但这不是实际发生的事情,因为没有无参数的.ctor方法关于价值类型.

上一篇:C#中Null类型


下一篇:RAC基本使用