Объявления переменной, после если операторы

Проблема подошла на другом форуме, и я знал, как зафиксировать его, но это показало функцию компилятора, специфичного для меня. Человек добирался, ошибка "Встроила оператор, не может быть оператор объявления или помеченный оператор", потому что у них было объявление переменной после если оператор без скобок. Это не было их намерением, но они закомментировали строку кода сразу после, если оператор, который сделал объявление переменной фактической строкой кода для выполнения. Так или иначе это - фон, который приносит мне к этому.

Следующий код недопустим

if (true)
    int i = 7;

Однако при обертывании этого в скобках это все законно.

if (true)
{
    int i = 7;
}

Никакая часть кода не полезна. Все же второй в порядке. Каково конкретно объяснение этого поведения?

59
задан Anthony Pegram 5 April 2013 в 15:53
поделиться

3 ответа

В спецификации языка C # различаются три типа операторов (см. Главу 8 для получения более подробной информации). В общем, у вас могут быть следующие операторы:

  • label-statement - я предполагаю, что это старомодный оператор goto оператор
  • оператор-декларация - который был бы объявление переменной
  • встроенный-оператор - который включает почти все оставшиеся операторы

В операторе if тело должно быть встроенным-оператором , что объясняет почему первая версия кода не работает. Вот синтаксис if из спецификации (раздел 8.7.1):

if ( логическое-выражение ) встроенный-оператор
if ( логическое-выражение ) встроенный-оператор else встроенный-оператор

Объявление переменной - объявление-оператор , поэтому оно не может появиться в теле. Если вы заключите объявление в скобки, вы получите блок операторов, который является встроенным оператором (и поэтому он может появиться в этой позиции).

80
ответ дан 24 November 2019 в 18:19
поделиться

Все компиляторы позволят вам скомпилировать бесполезный или крайне малоиспользуемый код. Просто существует слишком много способов, которыми разработчик может использовать язык для создания конструкций без использования. Заставить компилятор уловить их все - это слишком много усилий и, как правило, того не стоит.

Второй случай вызывается непосредственно в спецификации языка C # в начале раздела 8.0

Этот пример приводит к ошибке времени компиляции, потому что для оператора if требуется встроенный оператор, а не оператор для его ветки if. . Если бы этот код был разрешен, то переменная i была бы объявлена, но ее нельзя было бы использовать. Обратите внимание, однако, что, если поместить объявление i в блок, пример действителен.

Пример кода

void F(bool b) {
    if (b)
        int i = 44;
}
10
ответ дан 24 November 2019 в 18:19
поделиться

Если вы не включаете скобки, следующая строка выполняется так, как если бы она была заключена в квадратные скобки. Поскольку объявлять переменную в этой строке не имеет особого смысла (вы никогда не сможете ее использовать), компилятор C # не позволит это предотвратить, чтобы вы случайно не сделали это, не зная (что может привести к незначительным ошибкам ).

Вот часть Эрика Липперта, который говорит о компиляторе C # в этом SO-ответе о разрешении имен:

... C # - это не "угадайте, что имел в виду пользователь " "язык ... компилятор по дизайну громко жалуется, если лучшее совпадение - это то, что не работает

27
ответ дан 24 November 2019 в 18:19
поделиться
Другие вопросы по тегам:

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