【问题标题】:Why is ;; allowed after a local variable declaration, but not after a field declaration?为什么是 ;;在局部变量声明之后允许,但在字段声明之后不允许?
【发布时间】:2015-02-20 12:00:24
【问题描述】:

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

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

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

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

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

问题

字段的这种限制有什么理由吗?

Nb 我已经知道不允许var 带有字段的另一个限制性问题。但这里有些不同。

【问题讨论】:

  • 如何制作这些漂亮的屏幕转储补丁?
  • C#支持空语句so ;它本身在方法体中是有效的,但你不能在类的主体中包含语句,所以;在那里无效。
  • @DrKoch here
  • “漂亮”?什么时候直箭头变得比老式的手绘圆圈更漂亮了?至少它们是红色的。 +1 阴影。
  • @RoyiNamir 这个“来源”到“目的地”的东西是一个令人信服的论点。您可以在箭头周围添加一个圆圈以进一步改进它!但无论如何,更多的是关于free hand 部分而不是关于圆圈:i.stack.imgur.com/n5Y9I.png 看到美女了吗?

标签: c# compiler-errors


【解决方案1】:

; 单独是一个语句(空语句),但类的主体中只允许 declaration 语句;其他类型的语句只能出现在方法体中。

【讨论】:

  • 所以声明不是声明?以; 结尾的所有内容都是声明。
  • @Selman22 声明是一个声明。空语句本身不是声明语句。
  • @YuvalItzchakov 这个答案说类的主体中不允许有语句。如果声明是一个语句,那么这显然是错误的。
  • @Selman22:字段声明不是声明。局部变量声明是一个语句。没有错。
【解决方案2】:

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

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

【讨论】:

  • 我正要评论接受的答案,询问来源(语法)。谢谢,+1!
【解决方案3】:

它不是局部变量声明的一部分,它本身就是一个声明,正如 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;;;

有效。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      在函数体内多余的 ;是一个空语句,但在类声明中是一个未声明的字段,并且不允许。

      【讨论】:

      • 为什么要对已经回答的问题发布新答案,尤其是当您的答案错误且信息量比其他人少时?
      猜你喜欢
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多