??(空合并)与 ?(三元如果)表达式

本文关键字:三元 如果 表达式 合并 | 更新日期: 2023-09-27 18:22:10

>请看一下示例代码:

short? myNullableShort = 5;
short myShort = 0;
// It works
myShort = myNullableShort ?? 0;
// It doesn't work, Compiler error
// Cannot implicitly convert type 'short?' to 'short'. 
// An explicit conversion exists (are you missing a cast?)  
myShort = myNullableShort != null ? myNullableShort : 0;

我可以理解为什么第二个不起作用。但是,我希望第一个会导致编译器错误,但事实并非如此。

我的问题是,为什么第一个工作正常?

??(空合并)与 ?(三元如果)表达式

myNullableShort ?? 0的工作方式类似于myNullableShort != null ? myNullableShort.Value : 0。也就是说,?:的中间操作数是short类型的表达式,而不是short?

但是如果你想避免使用??,一种比?:更易读的编写方式是myNullableShort.GetValueOrDefault(),或者稍微更冗长的myNullableShort.GetValueOrDefault(0)

实际上,当你编写myNullableShort ?? 0时,编译器将在幕后使用该myNullableShort.GetValueOrDefault()a ?? b被转换为a.HasValue ? a.GetValueOrDefault() : b,作为微优化。

当你到达行时:

myShort = myNullableShort != null ? myNullableShort : 0;

myNullableShort 仍然是可为空的,并且不能将可为空的强制转换为不可为空的。

试试这个:

myShort = myNullableShort.HasValue ? myNullableShort.Value : 0;

第一个有效,因为您可以从不可为空值的值中为可为空值,并且myNullableShort ?? 0保证返回 myNullableShort(如果存在(或0