为什么null == false不会导致c#中的编译错误?

时间:2013-05-04 00:39:36

标签: c# compiler-construction

这不是解决任何特定问题。只是一个编译问题。

为什么以下代码不会导致编译错误?它将引用类型与基本类型进行比较。必须将null和false都解释为某些东西供编译器进行比较。或者解析器只是扫描这样的模式并用false替换它?

if(null == false) { }

3 个答案:

答案 0 :(得分:28)

这是合法的,因为使用了提升的比较运算符。如果您将boolnull进行比较,则boolnull会隐式转换为Nullable<bool>,而Nullable<bool>的比较运算符会结束被使用。你得到一个警告,因为很明显,它总是错误的。

答案 1 :(得分:15)

Tejas的回答是正确的。更具体地说明一些要点:

  

为什么以下代码不会导致编译错误?

问题不负责任;它不会产生错误,因为它是合法代码,但这是一个重言式。

如果您的问题实际上是“C#规范的哪个部分使其合法?”,那么这是一个可回答的问题。关于解除平等运营商的部分使其合法化。

  

它将引用类型与基本类型进行比较。

不是。首先,避免使用“原始类型”一词;规范没有明确定义它,它在C#中不是一个有用的概念。你的意思是说我认为它是将参考类型的值与值类型的值进行比较。

其次,这也不正确。 null文字不是引用类型或值类型;它不属于任何类型。它是 convertible 到任何可以为null的值类型或任何引用类型,但它本身就没有类型。

在这种情况下,null文字将转换为可空的bool类型。

  

必须将null和false都解释为某些东西供编译器进行比较。

正确。它们被解释为可以为空的布尔。

  

是解析器只是扫描这样的模式并用false替换它?

不,但这是一个很好的猜测。编译器常量折叠,比如true == false向下false,但它不会进行涉及可空值类型的折叠优化。可以重新设计该语言以支持具有可空值类型操作数的操作的常量折叠;具有可空的值类型反事实地处于版本1中,可能会支持所提出的特征。

答案 2 :(得分:12)

语言规范的第7.10.6节(引用类型相等运算符)指出:

  

即使T可以表示值类型,也允许x == null构造,并且当T是值类型时,结果被简单地定义为false。

此规定要求null == falsefalse,而不是编译器错误。