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

时间:2014-12-22 11:28:36

标签: c# compiler-errors

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

当我(通过偶然)将一个额外的/额外的分号放在函数的局部变量中时:

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

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

enter image description here

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

enter image description here

问题

在字段中存在这种限制性的原因吗?

Nb我已经知道不允许var字段的其他限制性事项。但在这里它有所不同。

5 个答案:

答案 0 :(得分:83)

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

答案 1 :(得分:26)

;本身是一个空话。在类范围内,只允许声明语句。类体在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
}

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

答案 2 :(得分:6)

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

这是有效的:

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


    ;
    Console.WriteLine(a); //dummy 
    ;;
}

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

while(mycondition) ;

将它放入课堂体内是没有意义的,它没有带来额外的价值。

TLDR;这与变量/字段声明

无关

您可能也想看一下这个帖子:When do you use scope without a statement in C#?

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

int a = 1;;;

有效。

答案 3 :(得分:3)

在第一种情况下,编译器会看到一个无操作语句。第二个;在变量声明之后出现并不重要。

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

答案 4 :(得分:-4)

功能体内部冗余;是一个空语句,但在类声明中是一个未声明的字段,不允许这样做。