Может ли кто-нибудь объяснить этот C # quirk? [Дубликат]

Согласитесь с Патриком Х. Этот код работает ...

Sub header()
With ActiveSheet.PageSetup
    .CenterHeader = "&F" & vbCrLf & "&A"
End With
End Sub
4
задан Daniel Fischer 10 May 2012 в 16:09
поделиться

3 ответа

Компилятор имеет неявное преобразование из выражения constant в различные примитивные типы (до тех пор, пока значение находится в соответствующем диапазоне), но здесь выражение не является постоянным - это просто int выражение. Это в значительной степени то же самое, что:

short s;
s = CallSomeMethodReturningInt32();

в отношении компилятора.

Есть два варианта: вы можете наложить целое выражение или отбросить каждую из последних два операнда:

short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;

, чтобы создать общий тип выражения short. В этом конкретном случае очень жаль, что не существует числового суффикса литерала для явного объявления литерала short. По-видимому, разработчики языка это рассматривали, но считали, что это относительно редкая ситуация. (Я думаю, что, вероятно, соглашусь.)

Часть о неявных константных конверсиях из раздела спецификации C # 3.0 6.1.8:

6.1.8 Неявное постоянное выражение конверсии

Неявное преобразование константных выражений допускает следующие преобразования:

  • Константное выражение (§7.18) типа int может быть преобразованные в тип sbyte, byte, short, ushort, uint или ulong, если значение константного выражения находится в пределах диапазона типа назначения.
  • Константное выражение типа типа long может быть преобразовано в тип ulong, если значение константного выражения не является отрицательным .
11
ответ дан Jon Skeet 27 August 2018 в 03:30
поделиться

Поскольку трансляция выполняется компилятором, а не во время выполнения, я бы не назвал его уродливым, я бы назвал его сложным синтаксисом:

s = (EitherTrueOrFalse()) ? (short)0 : (short)1;

Я имею в виду, это путь написан на C #, даже если он выглядит уродливым.

См. статью в блоге . См. ответ Марка Гравелла по этому вопросу.

1
ответ дан Community 27 August 2018 в 03:30
поделиться

Я полагаю, что по той же причине, что и не компилируется:

short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;

I.e. что всякий раз, когда короткий используется для чего-то, он получает повышение до int.

0
ответ дан erikkallen 27 August 2018 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: