我看到了这种奇怪的行为,我想知道是否有合理的解释:
当我(通过偶然)将一个额外的/额外的分号放在函数的局部变量中时:
public void MyMethod ()
{
int a = 1;;
Console.WriteLine(a); //dummy
}
它确实编译但它表明它是多余的。
但是当我用字段(也是偶然)做到这一点时,我得到了一个错误(编译):
问题
在字段中存在这种限制性的原因吗?
Nb我已经知道不允许var
字段的其他限制性事项。但在这里它有所不同。
答案 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)
功能体内部冗余;是一个空语句,但在类声明中是一个未声明的字段,不允许这样做。