Почему; разрешено после объявления локальной переменной, но не после объявления поля?
Я видел это странное поведение, и мне интересно, есть ли разумное объяснение этому:
когда я ставлю ( случайно) дополнительную/дополнительную точку с запятой в локальной переменной функции, например:
public void MyMethod ()
{
int a = 1;;
Console.WriteLine(a); //dummy
}
он компилируется, но он показывает, что это избыточно.
но когда я сделал это с полями (также случайно), я получил ошибку (компиляция) :
вопрос
есть ли причина для этого ограничения в полях ?
Nb я уже знаю другую ограничительную вещь для того, чтобы не позволять var
с поля. Но здесь все по-другому.
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;;;
действителен.