比较两个空的nullables

时间:2016-10-05 12:27:48

标签: c# nullable lifted-operators

C#5.0规范见第7.1.3章

https://msdn.microsoft.com/en-us/library/ms228593.aspx

  

如果一个或两个操作数都是false,则提升的运算符会生成值null

然而测试以及此MSDN链接

http://msdn.microsoft.com/en-us/library/2cf62fcy(v=vs.100).aspx

int? num1 = 10;
int? num2 = null;

// Change the value of num1, so that both num1 and num2 are null.
num1 = null;
if (num1 == num2)
{
  // The equality comparison returns true when both operands are null.
  Console.WriteLine("num1 == num2 returns true when the value of each is null");
}

/* Output:
 * num1 == num2 returns true when the value of each is null
 */

表明,比较两个null的可空值都会返回true

这有道理,但它与规范中的句子相矛盾,不是吗?

2 个答案:

答案 0 :(得分:5)

不要混合,这是关于不同类型的运营商。

  

•对于相等运算符   ==!=   如果操作数类型都是非可空值类型并且结果类型是bool,则存在提升形式的运算符。提升形式是通过添加一个?每个操作数类型的修饰符。 提升的运算符认为两个空值等于,并且空值不等于任何非空值。如果两个操作数都是非null,则提升的运算符将解包操作数并应用基础运算符来生成bool结果。

     

•对于关系运营商   < > < => =   如果操作数类型都是非可空值类型并且结果类型是bool,则存在提升形式的运算符。提升形式是通过添加一个?每个操作数类型的修饰符。 如果一个或两个操作数为空,则提升的运算符将生成值false。否则,提升的运算符会解包操作数并应用基础运算符来生成bool结果。

答案 1 :(得分:4)

规范后来说

  

•对于相等运算符   ==!=如果操作数类型都是非可空值类型且结果类型为bool,则存在提升形式的运算符。该   提升形式是通过添加一个?每个修饰符   操作数类型。 提升的运算符认为两个空值相等,和   空值不等于任何非空值。如果两个操作数都是   非空,提升的运算符解包操作数并应用   底层算子产生布尔结果。