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

Roy*_*mir 59 c# compiler-errors

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

当我(通过偶然)在函数的局部变量中添加额外的/额外的分号时,例如:

public void MyMethod ()
{
    int a = 1;;
    Console.WriteLine(a); //dummy 
}
Run Code Online (Sandbox Code Playgroud)

它确实编译但它表明它是多余的.

在此输入图像描述

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

在此输入图像描述

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

Nb我已经知道不允许var使用字段的其他限制性事项.但这里有些不同.

Tho*_*que 83

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

  • @ Selman22宣言是一份声明.空语句本身不是声明语句. (10认同)
  • @ Selman22:字段声明不是声明.局部变量声明是一个声明.没有错误. (2认同)

Sel*_*enç 26

;本身是一个空洞的陈述.在类范围内,只允许声明语句.类体定义在C# Specification 5.0, §10.1.6 Class Body

class-body:
{   class-member-declarations   }
Run Code Online (Sandbox Code Playgroud)

例如,您无法在单独的语句中初始化字段:

class Foo 
{
    int x = 2; // this is allowed 
    x = 5; // this is not
}
Run Code Online (Sandbox Code Playgroud)

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


Ert*_*maa 6

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

这是有效的:

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


    ;
    Console.WriteLine(a); //dummy 
    ;;
}
Run Code Online (Sandbox Code Playgroud)

分句声明的想法是允许这样的结构:

while(mycondition) ;
Run Code Online (Sandbox Code Playgroud)

允许它进入课堂体内是没有意义的,它没有带来额外的价值.

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

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

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

int a = 1;;;

已验证.