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

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

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

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

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

введите описание изображения здесь

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

введите описание изображения здесь

Вопрос

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

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

Ответ 1

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

Ответ 2

; - это пустой оператор. И в области класса допускаются только утверждения декларации. Тело класса определено в 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
}

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

Ответ 3

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

Это действительно:

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


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

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

while(mycondition) ;

Не имеет смысла допускать его в тело класса, это не приносит никакой дополнительной ценности.

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

Возможно, вы захотите также взглянуть на этот поток: Когда вы используете область действия без инструкции на С#?

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

int a = 1;;;

.

Ответ 4

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

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

Ответ 5

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