Нет неявного преобразования int -> short в троичном операторе

StackOverflow https://stackoverflow.com/questions/1672774

Вопрос

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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top