Согласитесь с Патриком Х. Этот код работает ...
Sub header()
With ActiveSheet.PageSetup
.CenterHeader = "&F" & vbCrLf & "&A"
End With
End Sub
Компилятор имеет неявное преобразование из выражения 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
, если значение константного выражения не является отрицательным .
Поскольку трансляция выполняется компилятором, а не во время выполнения, я бы не назвал его уродливым, я бы назвал его сложным синтаксисом:
s = (EitherTrueOrFalse()) ? (short)0 : (short)1;
Я имею в виду, это путь написан на C #, даже если он выглядит уродливым.
См. статью в блоге . См. ответ Марка Гравелла по этому вопросу.
Я полагаю, что по той же причине, что и не компилируется:
short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;
I.e. что всякий раз, когда короткий используется для чего-то, он получает повышение до int.