1

在 c# 中(可空类型)

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

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

输出为:20

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

我不明白为什么..

4

6 回答 6

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。

于 2012-09-17T16:49:42.120 回答
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,则可空类型的加法运算符始终返回 null

于 2012-09-17T16:47:17.630 回答
1

当你写:

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

它将有效地评估为:

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

上面的“temp”为空,所以你得到b.

于 2012-09-17T16:48:23.883 回答
1

在这里检查: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

于 2012-09-17T17:02:15.453 回答
0

因为 c 为空,所以答案是 b!那是你的双倍?做。

于 2012-09-17T16:45:27.117 回答
0

??运算符用于检查空值。它返回有问题的值,或者如果它为空,则返回后备。

c ?? b表示“c,除非 c 为空,在这种情况下为 b”。

c ?? b + a检查 c,发现它为空,并改用 b (20)。然后它添加 (10) 得到 30.*

a + c ?? b似乎是应用??toa + c而不仅仅是 c,导致整个东西被 b (20) 替换。

*不确定在这种情况下的操作顺序,由于 c 为空,它可能正在使用 (b + a)。

于 2012-09-17T16:49:01.747 回答