Нет неявного преобразования int -> short в троичном операторе
-
16-09-2019 - |
Вопрос
short s;
s = (EitherTrueOrFalse()) ? 0 : 1;
Это не удается с:
ошибка CS0266:Невозможно неявно преобразовать тип 'int' в 'short'.В Существует явное преобразование (вы пропускаете приведение?)
Кто-нибудь может объяснить, почему это так?Единственное, о чем я могу думать, это о том, что компилятор не смотрит на второе значение и не знает диапазона между ними, в случае, если я написал что-то вроде
short s;
s = (EitherTrueOrFalse()) ? 0 : 65000;
Правильно?Единственное исправление - это уродливый актерский состав?
Кроме того, похоже, что C # не имеет суффикса типа для короткого типа.Это довольно серьезная оплошность, ИМО.В противном случае, это было бы решением...
Решение
Компилятор имеет неявное преобразование из постоянный выражение для различных примитивных типов (при условии, что значение находится в соответствующем диапазоне), но здесь выражение не является постоянным - это просто выражение int.Это почти то же самое, что:
short s;
s = CallSomeMethodReturningInt32();
что касается компилятора.
Есть два варианта - вы можете привести все выражение целиком или привести каждый из последних двух операндов:
short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;
чтобы создать общий тип выражения short
.В данном конкретном случае жаль, что нет числового литерального суффикса для явного объявления short
буквально.Очевидно, разработчики языка действительно учитывали это, но посчитали, что это относительно редкая ситуация.(Думаю, я бы, наверное, согласился.)
Часть о неявных преобразованиях констант взята из раздела 6.1.8 спецификации C # 3.0:
6.1.8 Неявные преобразования постоянных выражений
Неявная константа преобразование выражения допускает следующие преобразования:
- A постоянное выражение (§7.18) типа
int
может быть преобразован в тип sbyte,byte
,short
,ushort
,uint
, илиulong
, обеспечил ценность постоянное выражение находится в пределах диапазона типа назначения.- A постоянное выражение типа
long
может быть преобразован в типulong
, при условии значение постоянное выражение не является отрицательным.
Другие советы
Потому что приведение выполняется компилятором, не во время выполнения, я бы не назвал это уродливым приведением, я бы назвал это сложным синтаксисом:
s = (EitherTrueOrFalse()) ? (short)0 : (short)1;
Я имею в виду, что именно так это написано на C #, даже если это выглядит уродливо.
Видишь это статья в блоге.Видишь Ответ Марка Гравелла по этому вопросу.
Я предполагаю, что это имеет ту же причину, что и это не будет компилироваться:
short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;
То есть.что всякий раз, когда short используется для чего-то, оно повышается до int .