繁体   English   中英

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

[英]Output (Nullable Types in C#)

在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) 

而+ c ?? b被评估为

 (a+c)??b

或者如果我们稍微扩展

 (a + c) == null ? b : c+a

或者如果我们用实际值代替

 (10 + null) == null ? 20 : 10 + null

可以再次缩短为

 null == null ? 20 : null

如果至少一个操作数为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合并运算符(??)的优先顺序比'+'的优先顺序小得多。 因此,始终先评估“ +”。

就你而言

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! 那是你的两倍? 做。

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

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

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

a + c ?? b a + c ?? b似乎正在应用?? 加到a + c而不仅仅是加到c上,导致整个事物被b(20)代替。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM