为什么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 ofintobj
for null assigned nullable value types?
因为Nullable< T> (或任何其他值类型)实际上没有无参数构造函数.您可以通过在反编译器中查看它或使用反射来验证它(例如typeof(Nullable<>).GetConstructors()).
如果你在C#中为某个值类型T编写新的T(),它看起来像是调用无参数构造函数(并且C#规范也将它称为构造函数),但这不是实际发生的事情,因为没有无参数的.ctor方法关于价值类型.