一些Visual Studio 2010或C#bug?还是我只是在做梦?

时间:2011-12-02 01:11:17

标签: c# visual-studio-2010

我刚用if语句创建了一个简单的项目来检查语句是否为真,但后来我偶然发现了一些奇怪的东西。

这是我的示例代码

 if(x ==1)
    {
      do something;
    }

 else if( x==2)
    {
      do something;
    }
else if( x==3)
    {
      do something;
    }
else if( x==4)
    {
      do something;
    }

    {
      do something;
    }
不,你读的没错。我也打错了。我遗漏了else语句,但我为它创建了大括号。当我编译时,它运行正常。这是某种错误吗?或者我刚刚对此感到陌生?我只是想知道。感谢所有答案

4 个答案:

答案 0 :(得分:17)

在大括号中包含任意数量的语句(包括零)始终在语法上是合法的。结果本身就是一个声明。

你总是使用这个事实;事实上,你在你的例子中使用了它六次。 “if”的结果总是单一的陈述。在您的示例中,该单个语句是包含另一个语句的块语句。

答案 1 :(得分:14)

将执行没有if/else if的最后一个代码块。大括号用于代码分离,并且不需要条件/迭代或任何其他前提来具有意义。

为了进一步解释我的观点:

{
    {
        Console.WriteLine("This works");
        int i;
    }
    // the variable i is out of scope and can't be referenced here
}

这也是可能的。

根据 @slugonamission 的评论,他提出了一个很好的观点。代码块还为在此代码块内创建的变量创建范围隔离。

答案 2 :(得分:5)

一组花括号定义了一个语句块。您可以将任何语句集合作为块,尽管最有用的情况是在控制结构之后使用它们将多个语句放入其中。块语句的语法只要求它后面的语句是一个语句 - 它可以是单个语句,也可以是块语句(这只是另一种语句)。

除了为局部变量创建新范围外,控制语句外部的块也没有太大作用。我喜欢在case内使用它们,因为案例不会自动创建新范围。

switch (foo) {
    case 1: {
        int i; // local to this case!
        break;
    }
    case 2: {
        int i;
        break;
    }
}

哦,还有这个:Don't rush to claim that you have found a bug

答案 3 :(得分:2)

这是有效的语法。括号本身仅表示一个单独的范围块;在这种情况下,与if - else if完全无关。

因此,在您的代码中,最后一个块将始终执行。