可空的结果令人惊讶

时间:2015-11-10 08:45:33

标签: c#

打印此程序的内容是什么?

static void Main(string[] args)
{
    int? other = null;
    int value = 100 + other ?? 0;
    Console.WriteLine(value);
}

我知道我的脑子里没有语言规范。但仍然令人惊讶的是它打印0而不是100.这种奇怪的行为是否有合理的解释?

当我使用大括号时,我得到了正确的结果。

static void Main(string[] args)
{
    int? other = null;
    int value = 100 + (other ?? 0);
    Console.WriteLine(value);
}

3 个答案:

答案 0 :(得分:5)

目前,表达式的评估结果为:

(100 + other) ?? 0;

other的值为null,数字加上null仍为空。所以表达式输出0。

在第二个示例中,您首先评估空检查,然后再添加100。

答案 1 :(得分:5)

由于plus(+)运营商higher precedence超过Null Coalescing Operator ??,您的结果为0。所以你的表达式被评估为:

(100 + other) ?? 0;

返回0。

在你的第二种情况下,你正在评估表达式(其他?? 0),首先给它更高的优先级。因此,您可以获得正确或预期的结果。

答案 2 :(得分:2)

C#运算符的优先级定义为clearly here

我们可以看到,

  

x + y - 另外。

是第29位,

  

x ?? y - 如果非空,则返回x;否则,返回y。

是第46位,因此在Null Coalescence之前评估Additive Addition。

对此背后的推理的猜测是该网站的偏离主题和更深层次的问题。这里的答案可能是subjective, even with direct input from the technical group,完整答案将比几段更长。