?? (null合并)vs? (三元if)表达

时间:2015-11-17 12:24:00

标签: c# .net

请看一下示例代码:

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;

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

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

2 个答案:

答案 0 :(得分:4)

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

但是如果你想避免使用??,那么写一个比?:更可读的方式是myNullableShort.GetValueOrDefault(),或者更详细的myNullableShort.GetValueOrDefault(0)

实际上,当您编写myNullableShort.GetValueOrDefault()时,编译器会在幕后使用myNullableShort ?? 0a ?? 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的值