猿问

有什么区别?为什么 Switch Case 在 C# 中是这样工作的?

我有两个函数,一个可以编译,另一个不能。有什么不同?


函数编号 1 是否假设 case 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++;

这行不通?


慕的地10843
浏览 149回答 2
2回答

手掌心

基本上,变量声明实际上比您想象的要宽;第二个示例受到“明确分配”的影响,因为它被声明(更广泛),但实际上并未分配,因此++对未分配的值毫无意义。如果你想要范围 per case,你可以做到......只需添加大括号:        switch (x)        {            case 1:            {                uint cId = (uint)3;                break;            }            case 2:            {                uint cId = (uint)5;                break;            }        }是不是有点烦?是的。它是反直觉的吗?是的。它会永远改变吗?不太可能,因为这将是一个重大的突破性变化,会阻止许多现有的 C# 编译。

慕后森

嗯,uint cId是在你的情况下定义的范围{...} 内switch scopeswitch (x){&nbsp; &nbsp; case 1:&nbsp; &nbsp; &nbsp; &nbsp; uint cId = (uint)3; // <- definition&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; case 2:&nbsp; &nbsp; &nbsp; &nbsp; // cId has been defined and thus can be assigned (initialization)&nbsp; &nbsp; &nbsp; &nbsp; cId = (uint)5; //NO ERROR HERE WHY?&nbsp; &nbsp; &nbsp; &nbsp; break;}&nbsp; // <- end of cId scope在第二种情况下variable已定义,但作为局部变量必须在使用前初始化(增量):switch (x){&nbsp; &nbsp; case 1:&nbsp; &nbsp; &nbsp; &nbsp; int y = 3;&nbsp; &nbsp; &nbsp; &nbsp; uint variable = tst; // <- definition&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; case 2:&nbsp; &nbsp; &nbsp; &nbsp; // variable defined, but has not been initialized ("case 1:" hasn't been run),&nbsp; &nbsp; &nbsp; &nbsp; // variable contains trash and so you can't increment it&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; variable++; //ERROR HERE WHY?&nbsp; &nbsp; &nbsp; &nbsp; break;} // <- end of variable scope
随时随地看视频慕课网APP
我要回答