打印此程序的内容是什么?
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);
}
答案 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,完整答案将比几段更长。