为什么是 ;; 允许在局部variables声明之后,而不是在一个字段声明之后?

我看到这种奇怪的行为,我不知道这是否有一个合理的解释:

当我在一个函数的局部variables中加上一个额外的分号时,

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

它编译,但它表明它是多余的。

在这里输入图像说明

但是当我做到这一点(也是偶然),我得到了一个错误(编译):

在这里输入图像说明

这个领域的限制是否有任何理由?

铌我已经知道另一个限制性的事情,不允许var与字段。 但这里有些不同

; 单独是一个陈述(空的陈述),但是只有陈述陈述在一个类的主体中被允许; 其他types的声明只能出现在方法的主体中。

; 本身是一个空的陈述。 而在类作用域中,只允许声明语句。类体在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 } 

所以你只能声明字段和其他成员,但不能在类体中使用其他语句。

这不是局部variables声明的一部分,正如Thomas所指出的那样,它本身就是一个声明。

这是有效的:

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

分号的说法是允许这样的结构:

 while(mycondition) ; 

让它在课堂上没有意义,它没有带来额外的价值。

TLDR; 这与variables/字段声明无关

你可能也想看看这个线程: 你什么时候在C#中使用没有语句的作用域?

它有点类似,但不完全,它会帮助你理解为什么

int a = 1;;;

已validation。

在第一种情况下,编译器会看到一个不可操作的语句。 第二个没关系, 在variables声明之后。

在第二种情况下,编译器会尝试创build一个不允许的空声明。

在一个function的内部冗余; 是一个空的陈述,但在类声明是一个未申报的领域,它不允许。