c# - 有什么区别,为什么 Switch Case 在 C# 中会这样工作?

标签 c# .net switch-statement

<分区>

我有两个函数,一个可以编译,一个不可以。有什么区别?

函数编号 1 是否假设情况 1 总是会被命中,或者它只是一个编译器问题?

public void Test(int x)
{
    switch (x)
    {
        case 1:
            uint cId = (uint)3;
            break;

        case 2:
            cId = (uint)5; //NO ERROR HERE. WHY?
            break;
    }
}

public void DeclaringInsideSwitch(int x)
{
    uint tst = 0;
    switch (x)
    {
        case 1:
            int y = 3;
            uint variable = tst;
            break;

        case 2:
            variable++; //ERROR HERE. WHY?
            break;
    }
}

我当然尝试搜索“在 C# 中的 switch case 内声明变量”,但对我来说,它现在似乎是 C# 中的某种错误,为向后兼容而保留。

// 在收到已回答的警告后,我的问题现在可以简化为真正的问题。

为什么:

int x;
x++;

这行不通吗?

最佳答案

基本上,变量声明实际上比您想象的要宽;第二个示例存在“​​明确赋值”问题,因为它被声明(更宽),但实际上并未赋值,因此 ++ 对未赋值的值没有任何意义。

如果您想要每个case的作用域,您可以做到...只需添加大括号:

        switch (x)
        {
            case 1:
            {
                uint cId = (uint)3;
                break;
            }
            case 2:
            {
                uint cId = (uint)5;
                break;
            }
        }

是不是有点烦?是的。它是反直觉的吗?是的。它会改变吗?不太可能,因为这将是一个重大的破坏性变化,会阻止许多现有的 C# 编译。

关于c# - 有什么区别,为什么 Switch Case 在 C# 中会这样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51475014/

相关文章:

.net - .Net 如何获得 UTC?

.net - 温莎城堡 : Registering Multiple Types

C:多 if 到少行

javascript - 通过单击 div 启用/禁用所有音效 - javascript

c# - 如何在 OpenXML 中获取 CustomXMLPart 的 Guid Id

c# - 如何创建带有 "Yes"、 "No"选项和 DialogResult 的消息框?

c# - 控制台托管 WCF 服务 Http 可在 mono 和 IIS 下访问

c# - 与 WCF 通信的 Android 应用程序

c# - C#中字符串前面的@是什么?

c# - 切换 PropertyType