在 c# 中(可空类型)
int a = 10;
int? b = 20;
int? c = null;
System.Console.WriteLine( a+c??b );
输出为:20
如果 (c??b +a) 则输出为 30
我不明白为什么..
在 c# 中(可空类型)
int a = 10;
int? b = 20;
int? c = null;
System.Console.WriteLine( a+c??b );
输出为:20
如果 (c??b +a) 则输出为 30
我不明白为什么..
这只是一个优先事项。
这:
System.Console.WriteLine(a + c ?? b);
相当于:
System.Console.WriteLine((a + c) ?? b);
a + c
为空(因为c
为空),因此打印 20(的值b
)
而这:
System.Console.WriteLine(c ?? b + a);
相当于:
System.Console.WriteLine(c ?? (b + a));
c
为空,因此计算 RHS ( b + a
),即 30。
c??b + a 被评估为
c?? (b+a)
或稍微扩大
c == null ? b + a : c
或者如果我们用实际值代替
null == null ? 20 + 10 : null)
而 a +c??b 被评估为
(a+c)??b
或者如果我们稍微扩大
(a + c) == null ? b : c+a
或者如果我们用实际值代替
(10 + null) == null ? 20 : 10 + null
这又可以缩短为
null == null ? 20 : null
如果至少有一个操作数为 null,则可空类型的加法运算符始终返回 null
当你写:
System.Console.WriteLine( a+c??b );
它将有效地评估为:
int? temp = a + c;
System.Console.WriteLine(temp ?? b);
上面的“temp”为空,所以你得到b
.
在这里检查:ECMA-334:14.2.1 运算符优先级和关联性
Null Coalescing 运算符 (??) 的优先顺序远低于 '+'。所以,“+”总是首先被评估。
在你的情况下,
int a = 10;
int? b = 20;
int? c = null;
a+c??b 计算为 (a+c)??b = (10+null)??20 = null??20 = 20
c??b+a 计算为 c??(b+a) = null??(10+20) = (10+20) = 30
因为 c 为空,所以答案是 b!那是你的双倍?做。
??
运算符用于检查空值。它返回有问题的值,或者如果它为空,则返回后备。
c ?? b
表示“c,除非 c 为空,在这种情况下为 b”。
c ?? b + a
检查 c,发现它为空,并改用 b (20)。然后它添加 (10) 得到 30.*
a + c ?? b
似乎是应用??
toa + c
而不仅仅是 c,导致整个东西被 b (20) 替换。
*不确定在这种情况下的操作顺序,由于 c 为空,它可能正在使用 (b + a)。