C# 给出指定强制转换的Null合并运算符无效

C# 给出指定强制转换的Null合并运算符无效,c#,.net,casting,null-coalescing-operator,C#,.net,Casting,Null Coalescing Operator,有人知道为什么最后一个不起作用吗 object nullObj = null; short works1 = (short) (nullObj ?? (short) 0); short works2 = (short) (nullObj ?? default(short)); short works3 = 0; short wontWork = (short) (nullObj ?? 0); //Throws: Specified cast is not valid 因为0是一个int,它被隐

有人知道为什么最后一个不起作用吗

object nullObj = null;
short works1 = (short) (nullObj ?? (short) 0);
short works2 = (short) (nullObj ?? default(short));
short works3 = 0;
short wontWork = (short) (nullObj ?? 0); //Throws: Specified cast is not valid

因为
0
是一个int,它被隐式转换为一个对象(已装箱),并且不能将已装箱的int直接解装箱为短整数。这将有助于:

short s = (short)(int)(nullObj ?? 0);

装箱的
T
(其中
T
当然是不可为空的值类型)可以仅对
T
T?
解除装箱。最后一行中的空合并运算符的结果是装箱的
int
。然后,您尝试将其取消装箱到
short
,这在执行时以您所示的方式失败

就好像你做了这件事:

object x = 0;
short s = (short) x;
空合并运算符的存在在这里有点令人费解。

解释了为什么这是必要的(即,为什么这不是仅使用1次强制转换自动完成的)。