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
。
这有道理,但它与规范中的句子相矛盾,不是吗?
答案 0 :(得分:5)
不要混合,这是关于不同类型的运营商。
•对于相等运算符 ==!= 如果操作数类型都是非可空值类型并且结果类型是bool,则存在提升形式的运算符。提升形式是通过添加一个?每个操作数类型的修饰符。 提升的运算符认为两个空值等于,并且空值不等于任何非空值。如果两个操作数都是非null,则提升的运算符将解包操作数并应用基础运算符来生成bool结果。
•对于关系运营商 < > < => = 如果操作数类型都是非可空值类型并且结果类型是bool,则存在提升形式的运算符。提升形式是通过添加一个?每个操作数类型的修饰符。 如果一个或两个操作数为空,则提升的运算符将生成值false。否则,提升的运算符会解包操作数并应用基础运算符来生成bool结果。
答案 1 :(得分:4)
规范后来说
•对于相等运算符 ==!=如果操作数类型都是非可空值类型且结果类型为bool,则存在提升形式的运算符。该 提升形式是通过添加一个?每个修饰符 操作数类型。 提升的运算符认为两个空值相等,和 空值不等于任何非空值。如果两个操作数都是 非空,提升的运算符解包操作数并应用 底层算子产生布尔结果。