另一个论坛上出现了一个问题,我知道如何解决它,但它揭示了我特有的编译器功能。该人收到错误“嵌入式语句不能是声明或标记语句”,因为他们在没有括号的 if 语句后声明了一个变量。这不是他们的意图,但他们注释掉了紧跟在 if 语句之后的代码行,这使得变量声明成为实际要执行的代码行。不管怎样,这就是背景,让我想到了这里。
下面的代码是非法的
if (true)
int i = 7;
但是,如果将其括在括号中,则一切都是合法的。
if (true)
{
int i = 7;
}
这两段代码都没有用。但是第二个还可以。这种行为的具体解释是什么?
最佳答案
C# language specification区分三种类型的陈述(更多细节见第 8 章)。一般来说,你可以有这些语句:
- labeled-statement - 我猜这是老式的
goto
语句 - declaration-statement - 这将是一个变量声明
- embedded-statement - 包括几乎所有剩余的语句
在 if
语句中,主体必须是 embedded-statement,这解释了为什么第一个版本的代码不起作用。以下是规范中的 if
语法(第 8.7.1 节):
if ( boolean-expression ) embedded-statement
if ( boolean-expression ) embedded-statement else embedded-statement
变量声明是declaration-statement,所以它不能出现在正文中。如果将声明括在方括号中,您将得到一个语句 block ,它是一个嵌入语句(因此它可以出现在该位置)。
关于c# - if 语句后的变量声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2496589/