Компилятор имеет неявное преобразование из выражения constant в различные примитивные типы (до тех пор, пока значение находится в соответствующем диапазоне), но здесь выражение не является постоянным - это просто int выражение. Это в значительной степени то же самое, что:
short s;
s = CallSomeMethodReturningInt32();
в отношении компилятора.
Есть два варианта: вы можете наложить целое выражение или отбросить каждую из последних два операнда:
short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;
, чтобы создать общий тип выражения short
. В этом конкретном случае очень жаль, что не существует числового суффикса литерала для явного объявления литерала short
. По-видимому, разработчики языка это рассматривали, но считали, что это относительно редкая ситуация. (Я думаю, что, вероятно, соглашусь.)
Часть о неявных константных конверсиях из раздела спецификации C # 3.0 6.1.8:
6.1.8 Неявное постоянное выражение конверсии
Неявное преобразование константных выражений допускает следующие преобразования:
blockquote>
- Константное выражение (§7.18) типа
int
может быть преобразованные в тип sbyte,byte
,short
,ushort
,uint
илиulong
, если значение константного выражения находится в пределах диапазона типа назначения.- Константное выражение типа типа
long
может быть преобразовано в типulong
, если значение константного выражения не является отрицательным .