Оператор null coalescing, дающий указанное приведение, недопустим 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
2 ответов
, потому что 0
- это int, который неявно преобразуется в объект (boxed), и вы не можете распаковать boxed int непосредственно в short. Это сработает:
short s = (short)(int)(nullObj ?? 0);
в коробке T
(где T
является ненулевым типом значения, конечно) может быть распакован только в T
или T?
.
результатом оператора null-coalescing в последней строке является boxed int
. Затем вы пытаетесь распаковать это в short
, который терпит неудачу во время исполнения так, как вы показали.
Это как вы сделали это:
object x = 0;
short s = (short) x;
присутствие оператора null-coalescing здесь немного отвлекает.