Нулевой оператор объединения, задающий указанное приведение, недопустимо int для short - PullRequest
10 голосов
/ 04 января 2012

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

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 ]

15 голосов
/ 04 января 2012

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

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

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

5 голосов
/ 04 января 2012

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

...