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