C# 为什么是;;在局部变量声明后允许,但在字段声明后不允许?

C# 为什么是;;在局部变量声明后允许,但在字段声明后不允许?,c#,compiler-errors,C#,Compiler Errors,我看到了这种奇怪的行为,我想知道是否有合理的解释: 当我(无意中)在函数的局部变量中添加了一个额外的分号时,如: public void MyMethod () { int a = 1;; Console.WriteLine(a); //dummy } 它确实可以编译,但它表明它是冗余的 但当我对字段执行此操作时(也是出于偶然),我得到了一个错误(编译): 问题 是否有任何理由限制这些领域 注意:我已经知道另一个限制,即不允许var带有字段。但这里有些不同。单独是一个语句

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

当我(无意中)在函数的局部变量中添加了一个额外的分号时,如:

public void MyMethod ()
{
    int a = 1;;
    Console.WriteLine(a); //dummy 
}
它确实可以编译,但它表明它是冗余的

但当我对字段执行此操作时(也是出于偶然),我得到了一个错误(编译):

问题

是否有任何理由限制这些领域


注意:我已经知道另一个限制,即不允许
var
带有字段。但这里有些不同。

单独是一个语句(空语句),但在类的主体中只允许声明语句;其他类型的语句只能出现在方法体中。

在第一种情况下,编译器会看到一条无操作语句。第二个
位于变量声明之后


在第二种情况下,编译器看到有人试图创建一个不允许的空声明。

它不是局部变量声明的一部分,它本身就是一个语句,如Thomas所示

这是有效的:

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


    ;
    Console.WriteLine(a); //dummy 
    ;;
}
分号语句的思想是允许这样的构造:

while(mycondition) ;
允许它出现在类的主体中是没有意义的,它不会带来额外的价值

TLDR;这与变量/字段声明无关

您可能也想看看这个线程:

这有点类似,但不完全一样,它会帮助你理解原因

inta=1


有效。

本身是一个空语句。在类范围内,只允许声明语句。类主体在
C#规范5.0,§10.1.6类主体中定义

class-body:
{   class-member-declarations   }
例如,不能在单独的语句中初始化字段:

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

因此,您只能声明字段和其他成员,但不能在类主体中使用其他语句。

在函数主体内部使用冗余语句;是空语句,但在类声明中是未声明的字段,不允许使用。

如何生成这些漂亮的屏幕转储修补程序?C#支持空语句,因此;它本身在方法体中是有效的,但是在类的体中不能有语句,所以;在那里无效。@koch博士“漂亮”?什么时候直箭变得比旧的手绘圆圈更漂亮了?至少它们是红色的+1表示放置阴影。@RoyiNamir这个从“源”到“目标”的说法很有说服力。您可以在箭头周围添加一个圆圈来进一步改进它!但不管怎么说,它更多的是关于部分而不是关于圆:看到美了吗?所以宣言不是一个声明?以
结尾的所有内容是一条语句。@Selman22声明是一条语句。空语句本身不是声明语句。@YuvalItzchakov这个回答说类的主体中不允许有语句。如果声明是一个语句,那么这显然是错误的。@Selman22:字段声明不是一个语句。局部变量声明是一个语句。没什么不对的。我正要对公认的答案发表评论,询问来源(语法)。谢谢,+1!你为什么要对一个已经回答过的问题发布一个新的答案,尤其是当你的答案是错误的,而且信息量比其他人少的时候?