给定指定强制转换的空合并运算符无效

时间:2012-01-04 14:45:56

标签: 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

2 个答案:

答案 0 :(得分:15)

因为0是一个int,它被隐式转换为一个对象(盒装),并且你不能将一个盒装的int直接解包为short。这将有效:

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

装箱T(当然T是不可为空的值类型)可能只会被TT?取消装箱。

答案 1 :(得分:5)

最后一行中的null-coalescing运算符的结果是一个加框的int。然后,您尝试将其解包到short,但在执行时以您显示的方式失败。

就像你这样做了:

object x = 0;
short s = (short) x;

null-corangecing运算符的存在在这里有点像红鲱鱼。