用C#转到困难(goto difficulties with C#)

2019-09-28 17:29发布

为什么我会收到以下编译器错误:

//错误CS0159:没有这样的标签“lbl_proc_20”

用下面的代码:

//JUST A DUMMY CODE TO ILLUSTRATE THE CONCEPT
int a = resultOfFunction1();
int b = resultOfFunction2();

//10+ Local variables that are calculated depending on the results above

if (a < 10)
{
    switch (b)
    {
        case 0:
            //Actions for A<10, B=0, using local variables
            break;
        case 1:
            double c = someFunction(a, b);  //In real code involves calculations based on a and b
            if(c > 10.0)
                goto lbl_proc_20;   //error CS0159: No such label 'lbl_proc_20' within the scope of the goto statement

                    //Actions for A<10, B=1, using local variables
            break;
        default:
            //Actions for A<10, B=Other, using local variables
            break;
    }
}
else if (a < 20)
{
lbl_proc_20:
    switch(b)
    {
        case 0:
            //Actions for A<20, B=0, using local variables
            break;
        case 1:
            //Actions for A<20, B=1, using local variables
            break;
        case 2:
            //Actions for A<20, B=2, using local variables
            break;
        default:
            //Actions for A<20, B=Other, using local variables
            break;
    }
}
else if (a < 30)
{
    switch(b)
    {
        case 0:
            //Actions for A<30, B=0, using local variables
            break;
        case 1:
            //Actions for A<30, B=1, using local variables
            break;
        case 2:
            //Actions for A<30, B=2, using local variables
            break;
        default:
            //Actions for A<30, B=Other, using local variables
            break;
    }
}

为什么我会得到一个错误的goto语句,以及如何使其工作?

编辑:改变了样品来说明实际的代码。

Answer 1:

您只能使用goto的范围内跳转到标签goto 。 从文档描述错误CS0159

由goto语句引用的标签不能goto语句的范围内被发现。

虽然标签存在,你不能跳出了的if块到else块。 中的代码else是不一样的范围为包含goto

现在是时候调整你的代码,因此它不需要goto

编辑

你应该尽量简化你的逻辑。 多种功能是最好goto语句。

你可能要考虑的一个选择是Windows工作流基础 。 这是一个非常整洁的工具,可以让你直观地代表你的逻辑流程图。 那么WWF会产生处理您指定的逻辑所需的代码。 这可能适用于因为它看起来像你创造一些类型的有限状态机或类似的过程。



Answer 2:

作为回应,以“如何做没有转到”

bool pretendA20 = false;

if (a < 10)
{
    switch (b)
    {
        case 0:
            //Actions for A<10, B=0, using local variables
            break;
        case 1:
            double c = someFunction(a, b);  //In real code involves calculations based on a and b
            if(c > 10.0)
            {
                //goto lbl_proc_20;   
                pretendA20 = true;
                break;
             }

             //Actions for A<10, B=1, using local variables

            break;
        default:
            //Actions for A<10, B=Other, using local variables
            break;
    }
}

if ((a >= 10 && a < 20) || pretendA20)
{
//lbl_proc_20:
    switch(b)
    {


Answer 3:

C#语言规范(第249页上的第8章)规定:

如果具有给定名称的标签不会在当前函数成员存在,或者如果goto语句是不是标签的范围之内,则发生编译时错误。 此规则允许使用goto语句将控制转移出嵌套范围,而不是到嵌套范围。

在你的情况下,标签lbl_proc_20不在同一范围内goto和你想控制转移到另一个嵌套范围。

你可以从这里抢语言规范:

http://www.microsoft.com/en-us/download/details.aspx?id=7029



文章来源: goto difficulties with C#
标签: c# goto