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!你为什么要对一个已经回答过的问题发布一个新的答案,尤其是当你的答案是错误的,而且信息量比其他人少的时候?