??(空合并)与 ?(三元如果)表达式
本文关键字:三元 如果 表达式 合并 | 更新日期: 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