在c#(可空类型)
中int a = 10;
int? b = 20;
int? c = null;
System.Console.WriteLine( a+c??b );
输出为:20
if(c ?? b + a)则输出为30
我不明白为什么......
答案 0 :(得分:2)
这只是一个优先事项。
此:
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。
答案 1 :(得分:1)
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
答案 2 :(得分:1)
当你写:
System.Console.WriteLine( a+c??b );
它将有效地评估为:
int? temp = a + c;
System.Console.WriteLine(temp ?? b);
上面的“temp”为null,因此您得到b
的结果。
答案 3 :(得分:1)
点击此处:ECMA-334: 14.2.1 Operator precedence and associativity
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
答案 4 :(得分:0)
因为c为null,所以答案是b!那是你的双倍?做。
答案 5 :(得分:0)
??
运算符用于检查空值。它返回有问题的值,如果它为null,则返回回退。
c ?? b
表示“c,除非c为空,在这种情况下为b”。
c ?? b + a
检查c,并看到它为空,并使用b(20)代替。然后它添加一个(10)得到30。*
a + c ?? b
似乎将??
应用于a + c
而不仅仅是c,导致整个事物被替换为b(20)。
*在这种情况下不确定操作的顺序,由于c为空,可能正在使用(b + a)。