Оператор с нулевым коалесцентом, задающий заданный литой, недействителен int short

Кто-нибудь знает, почему последний не работает?

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

Ответ 1

Поскольку 0 - это int, который неявно преобразуется в объект (в штучной упаковке), и вы не можете сразу удалить коробочный int напрямую. Это будет работать:

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

В коробке T (где T - тип значения, не допускающего нулевой, конечно) может быть распакован только для T или T?.

Ответ 2

Результат оператора нуль-коалесценции в последней строке - это boxed int. Затем вы пытаетесь распаковать его на short, который не работает во время выполнения так, как вы показали.

Как вы это сделали:

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

Присутствие оператора с нулевым коалесцированием здесь немного красношейни.