输出(C#中的可空类型)

时间:2012-09-17 16:44:45

标签: c#

在c#(可空类型)

int a = 10;
int? b = 20;
int? c = null;

System.Console.WriteLine( a+c??b );

输出为:20

if(c ?? b + a)则输出为30

我不明白为什么......

6 个答案:

答案 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)。