【问题标题】:Comparing two null nullables比较两个可空值
【发布时间】:2017-02-13 21:34:00
【问题描述】:

C# 5.0 规范见第 7.1.3 章

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

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

然而测试和这个 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

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

【问题讨论】:

标签: c# nullable lifted-operators


【解决方案1】:

不要混用,这是关于不同类型的运算符。

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

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

【讨论】:

    【解决方案2】:

    Spec 后来说

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

    【讨论】:

    • 哦,你是第一个,你赢了:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2021-12-03
    • 2020-07-22
    相关资源
    最近更新 更多