2

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

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

4

2 回答 2

5

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

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

• 对于关系运算符< > <= >=,如果操作数类型都是非空值类型并且结果类型是bool,则存在运算符的提升形式。提升的形式是通过添加单个 ? 每个操作数类型的修饰符。如果一个或两个操作数为 null ,则提升的运算符会产生值 false。否则,提升的运算符会展开操作数并应用底层运算符来生成 bool 结果。

于 2016-10-05T12:35:13.000 回答
4

规范后来说

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

于 2016-10-05T12:34:13.807 回答