Почему; разрешено после объявления локальной переменной, но не после объявления поля?


Я видел это странное поведение, и мне интересно, есть ли разумное объяснение этому:

когда я ставлю ( случайно) дополнительную/дополнительную точку с запятой в локальной переменной функции, например:

public void MyMethod ()
{
    int a = 1;;
    Console.WriteLine(a); //dummy 
}

он компилируется, но он показывает, что это избыточно.

но когда я сделал это с полями (также случайно), я получил ошибку (компиляция) :

вопрос

есть ли причина для этого ограничения в полях ?

Nb я уже знаю другую ограничительную вещь для того, чтобы не позволять var с поля. Но здесь все по-другому.

5 59

5 ответов:

; только оператор (пустой оператор), но только декларация операторы допускаются в теле класса; другие типы операторов могут появляться только в теле метода.

; само по себе является пустым утверждением. И в области видимости класса разрешены только операторы объявления.Тело класса определяется в C# Specification 5.0, §10.1.6 Class Body

class-body:
{   class-member-declarations   }

например, вы не можете инициализировать поля в отдельном заявлении:

class Foo 
{
    int x = 2; // this is allowed 
    x = 5; // this is not
}

таким образом, вы можете объявлять только поля и другие члены, но вы не можете использовать другие операторы в теле класса.

Это не часть объявления локальной переменной, это заявление само по себе, как указано Томасом.

это допустимо:

public void MyMethod ()
{
    ;;;
    int a = 1;


    ;
    Console.WriteLine(a); //dummy 
    ;;
}

идея оператора с запятой состоит в том, чтобы разрешить такие конструкции:

while(mycondition) ;

Это не имеет смысла, чтобы позволить ему в тело класса, он не приносит никакой дополнительной стоимости.

TLDR; это не имеет ничего общего с объявлением переменной/поля

вы можете взглянуть на эту тему тоже: когда вы используете область без оператора в C#?

Это похоже, но не полностью, это поможет вам понять, почему

int a = 1;;;

действителен.

в первом случае компилятор видит оператор no-op. Не важно, что второй ; после объявления переменной.

во втором случае компилятор видит попытку создать пустое объявление, которое не разрешено.

внутри тела функции избыточное; является пустым оператором, но в объявлении класса является необъявленным полем, и это не допускается.