为什么是 ;; 允许在局部variables声明之后,而不是在一个字段声明之后?
我看到这种奇怪的行为,我不知道这是否有一个合理的解释:
当我在一个函数的局部variables中加上一个额外的分号时,
public void MyMethod () { int a = 1;; Console.WriteLine(a); //dummy }
它编译,但它表明它是多余的。
但是当我做到这一点(也是偶然),我得到了一个错误(编译):
题
这个领域的限制是否有任何理由?
铌我已经知道另一个限制性的事情,不允许var
与字段。 但这里有些不同
;
单独是一个陈述(空的陈述),但是只有陈述陈述在一个类的主体中被允许; 其他types的声明只能出现在方法的主体中。
;
本身是一个空的陈述。 而在类作用域中,只允许声明语句。类体在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 }
所以你只能声明字段和其他成员,但不能在类体中使用其他语句。
这不是局部variables声明的一部分,正如Thomas所指出的那样,它本身就是一个声明。
这是有效的:
public void MyMethod () { ;;; int a = 1; ; Console.WriteLine(a); //dummy ;; }
分号的说法是允许这样的结构:
while(mycondition) ;
让它在课堂上没有意义,它没有带来额外的价值。
TLDR; 这与variables/字段声明无关
你可能也想看看这个线程: 你什么时候在C#中使用没有语句的作用域?
它有点类似,但不完全,它会帮助你理解为什么
int a = 1;;;
已validation。
在第一种情况下,编译器会看到一个不可操作的语句。 第二个没关系, 在variables声明之后。
在第二种情况下,编译器会尝试创build一个不允许的空声明。
在一个function的内部冗余; 是一个空的陈述,但在类声明是一个未申报的领域,它不允许。