可为Null,结果令人惊讶

本文关键字:结果 Null 可为 | 更新日期: 2023-09-27 18:21:15

什么打印这个程序?

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);
}

可为Null,结果令人惊讶

当前表达式的计算结果为:

(100 + other) ?? 0;

other的值为null,数字加上null仍然为null。因此表达式输出0。

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

由于plus(+)运算符的优先级高于Null Coalescing Operator ??,因此结果为0。因此,您的表达式被评估为:

(100 + other) ?? 0;

其返回0。

在第二种情况下,您首先计算表达式(其他??0),使其具有更高的优先级。因此,你得到了正确的或预期的结果。

这里明确定义了C#运算符的优先级。

我们可以看到,

x+y–加法。

是第29位,

x??y–如果x为非空,则返回x;否则,返回y.

是第46位,因此在零聚结之前评估添加剂添加。

关于这背后的原因的猜测是本网站的主题,也是一个更深层次的问题。这里的答案可能是主观的,即使有技术小组的直接输入,完整的答案也会比几段更长。