请看一下示例代码:
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;
我能理解为什么第二个不起作用。但是,我希望第一个会导致编译器错误,但事实并非如此。
我的问题是,为什么第一个工作正常?
答案 0 :(得分:4)
myNullableShort ?? 0
的作用类似于myNullableShort != null ? myNullableShort.Value : 0
。也就是说,?:
的中间操作数是short
类型的表达式,而不是short?
。
但是如果你想避免使用??
,那么写一个比?:
更可读的方式是myNullableShort.GetValueOrDefault()
,或者更详细的myNullableShort.GetValueOrDefault(0)
。
实际上,当您编写myNullableShort.GetValueOrDefault()
时,编译器会在幕后使用myNullableShort ?? 0
:a ?? b
会被转换为a.HasValue ? a.GetValueOrDefault() : b
,作为微优化。< / p>
答案 1 :(得分:1)
当你到达该行时:
<span>
myNullableShort仍然可以为空,并且您无法将可空置为非可空。
试试这个:
myShort = myNullableShort != null ? myNullableShort : 0;
第一个有效,因为您可以从不可为空的内容中指定一个可为空的值,myShort = myNullableShort.HasValue ? myNullableShort.Value : 0;
保证返回myNullableShort ?? 0
(如果存在)或myNullableShort
的值