Оператор с нулевым коалесцентом, задающий заданный литой, недействителен 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;
Присутствие оператора с нулевым коалесцированием здесь немного красношейни.