Оператор 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 здесь немного отвлекает.