为什么局部变量声明后可以使用“;;”,而字段声明后却不行?

59

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

当我无意中在一个函数的局部变量中加入了一个额外的分号时,出现了以下奇怪的情况:

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

它可以编译,但显示它是多余的。

在此输入图像描述

但当我意外地对字段执行相同操作时,我遇到了一个错误(编译):

在此输入图像描述

问题

为什么字段有这种限制性?

Nb 我已经知道不允许使用var定义字段的另一种限制性事项。但这里是另一回事。


34
你是如何制作这些漂亮的截屏补丁的? - DrKoch
15
C#支持空语句,因此在方法体内只有;是有效的,但是你不能在类的主体中使用语句,所以;在那里是无效的。 - Ben Robinson
2
@DrKoch 这里 - Royi Namir
13
“美丽”?直箭头何时比老式的手绘圆更美丽了?至少它们是红色的。加一分滴影效果。 - kapex
3
"source"和"destination"这一点是一个有说服力的论点。你可以在箭头周围添加一个圆圈来进一步改进它!但无论如何,这更多地涉及到free hand部分而不是圆圈:http://i.stack.imgur.com/n5Y9I.png 看到美了吗? - kapex
显示剩余2条评论
5个回答

83

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


1
所以声明不是语句?所有以 ; 结尾的都是语句。 - Selman Genç
10
声明是一种陈述。单独的空语句并不构成声明语句。 - Yuval Itzchakov
@YuvalItzchakov 这个答案说_语句不允许出现在类的主体中。_如果声明是一个语句,那么这显然是错误的。 - Selman Genç
2
@Selman22:字段声明不是语句。局部变量声明是语句。没有问题。 - Ben Voigt

26

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

class-body:
{   class-member-declarations   }
例如,你不能在单独的语句中初始化一个字段:
class Foo 
{
    int x = 2; // this is allowed 
    x = 5; // this is not
}

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


我正要在已接受的答案中评论并询问来源(语法)。谢谢,点赞! - Chris Cirefice

6

这不是局部变量声明的一部分,它是一个独立的语句,正如Thomas所指示的。

以下是有效的代码:

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


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

分号语句的思想是允许这样的结构:
while(mycondition) ;

将其放在类的主体中是没有意义的,不会带来额外的价值。

简而言之,这与变量/字段声明无关。

您可能还想查看此线程:在C#中何时使用没有语句的范围?

它有点相似,但不完全相同,它将帮助您了解为什么

int a = 1;;;

是有效的。


3
在第一个情况下,编译器看到了一个空操作语句。第二个分号出现在变量声明之后并不重要。
在第二个情况下,编译器看到了试图创建一个不允许的空声明。

-4
在函数体内,多余的分号是一个空语句,但在类声明中则是一个未声明的字段,不被允许。

2
为什么你要在一个问题已经得到回答的情况下发布新的答案,特别是当你的答案是错误的且比其他人提供的信息更少时? - siride

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接