你能解释一下,为什么控制台会这样吗.WriteLine写空行(Console.WriteLine(null)
给我编译错误)以及为什么没有NullReferenceException(即使a+=1
也不应该引发它)?
int? a = null;
a++; // Why there is not NullReferenceException?
Console.WriteLine(a); // Empty line
你能解释一下,为什么控制台会这样吗.WriteLine写空行(Console.WriteLine(null)
给我编译错误)以及为什么没有NullReferenceException(即使a+=1
也不应该引发它)?
int? a = null;
a++; // Why there is not NullReferenceException?
Console.WriteLine(a); // Empty line
你正在观察lifted operator的效果.
根据C#5规范第7.3.7节:
提升运算符允许对不可为空值类型进行操作的预定义运算符和用户定义运算符也可与这些类型的可为空形式一起使用.提升运算符由满足特定要求的预定义和用户定义运算符构造,如下所述:
- 对于一元运算符
+ ++ - -- ! ~
如果操作数和结果类型都是不可为空值类型,则存在运算符的提升形式.提升的形式是通过向操作数和结果类型添加单个?
修饰符来构造的.如果操作数为空,则提升的运算符将生成空值.否则,提升的运算符将展开操作数,应用基础运算符,然后包装结果.
因此,基本上,本例中的a++
是一个结果为null
的表达式(作为int?
),变量保持不变.
当你打电话的时候
Console.WriteLine(a);
它被装箱为object
,这会将其转换为空引用,并将其打印为空行.