c# - if 语句后的变量声明

标签 c# if-statement

另一个论坛上出现了一个问题,我知道如何解决它,但它揭示了我特有的编译器功能。该人收到错误“嵌入式语句不能是声明或标记语句”,因为他们在没有括号的 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/

相关文章:

C# 如何在对象构造后执行代码(postconstruction)

c# - 在 ScatterViewItem 中将控制区与图像分离

java - 将 getter 方法中的名称与用户输入字符串进行比较时出现问题

c# - 请告诉我为什么这段代码会生成输出 'Base Class' 。虽然 Object 是 Derived2 类型,并且引用变量也是相同类型

c# - MVVM + 多级/嵌套数据绑定(bind)

c# - 转换 bool[] -> "false, true, true, false"的简洁代码

javascript - if else 无法获得正确的返回值

linux - Awk/Sed/Perl - 如果两个连续的列匹配两个模式,则创建一个新行

php - 为什么 'Cannot break/continue 1 level' 出现在 PHP 中?

ios - 编程 IBAction 按钮打开/关闭 map 层