c# - 为什么 C# 允许在 case 之后而不是之前的语句?

标签 c# .net switch-statement

为什么 C# 允许这个:

var s = "Nice";
switch (s)
{
    case "HI":
        break;
    const string x = "Nice";
    case x:
        Console.Write("Y");
        break;
}

但不是这个:

var s = "Nice";
switch (s)
{
    const string x = "Nice";
    case x:
        Console.Write("Y");
        break;
}

最佳答案

因为你的缩进有误导性,第一个代码实际上是:

var s = "Nice";
switch (s)
{
    case "HI":
        break;
        const string x = "Nice";
    case x:
        Console.Write("Y");
        break;
}

也就是说,xcase 语句中声明(尽管在 break 之后),它是有效的。但是,直接在 switch 语句中它是无效的——唯一有效的语句是 casedefault

此外,const 声明在编译时 求值,因此即使有 break 也会定义 x声明之前。

但是,请注意 Mono C# 编译器不会编译这段代码,它会提示“当前作用域中不存在名称 'x'”,所以 Mono似乎比 .NET 编译器执行更多检查。但是,我在 C# 标准中找不到任何禁止使用 const 声明的规则,因此我假设 .NET 编译器是正确的,而 Mono 编译器是错误的。

关于c# - 为什么 C# 允许在 case 之后而不是之前的语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16694189/

相关文章:

c# - 创建 ASP.Net 成员数据库的代码

c# - EF Code First - 从 Azure 门户运行更新数据库

c# - 传递用双引号括起来的参数

c# - 我如何告诉 Resharper 我的 IEnumerable 方法删除了空值?

java - Switch 语句未添加到变量。怎么了?

c# - 在 JavaScript/jQuery 中显示更多/更少而不剥离 Html 标签

javascript - 如何访问 jquery 内部数据?

c# - 如果没有打开文件的程序,则捕获文件的打开

java - 比较多个字符串时切换大小写与 If, else

java - Android Java - 开关问题