C#Puzzle:可访问的转到指向无法访问的标签

时间:2009-07-22 19:32:58

标签: c# goto

以下是来自this post的Eric Lippert的评论:

  

现在你知道了答案,你可以   解决这个难题:给我写一个程序   其中有一个可达的goto   这是一个无法访问的标签。 -   Eric Lippert 7月17日7:17

我无法创建一个代码,该代码具有指向无法访问标签的可访问goto。这甚至可能吗?如果是,C#代码会是什么样的?

注意:我们不要讨论'goto'是如何不好等等。这是一个理论练习。

3 个答案:

答案 0 :(得分:13)

我原来的回答:

    try
    {
        goto ILikeCheese;
    }
    finally
    {
        throw new InvalidOperationException("You only have cottage cheese.");
    }
ILikeCheese:
    Console.WriteLine("MMM. Cheese is yummy.");

这里没有编译器警告。

    bool jumping = false;
    try
    {
        if (DateTime.Now < DateTime.MaxValue)
        {
            jumping = (Environment.NewLine != "\t");
            goto ILikeCheese;
        }

        return;
    }
    finally
    {
        if (jumping)
            throw new InvalidOperationException("You only have cottage cheese.");
    }
ILikeCheese:
    Console.WriteLine("MMM. Cheese is yummy.");

答案 1 :(得分:0)

顺便说一句,如果您使用goto csharp编译器,例如这种情况没有finally块,则将代码更改为没有goto的版本。

using System;
public class InternalTesting
{
public static void Main(string[] args)
{
  bool jumping = false;
    try
    {
        if (DateTime.Now < DateTime.MaxValue)
        {
            jumping = (Environment.NewLine != "\t");
            goto ILikeCheese;
        }
    else{
            return;
    }
    }
    finally
    {
        if (jumping)
{
            //throw new InvalidOperationException("You only have cottage cheese.");
    Console.WriteLine("Test Me Deeply");
}
    }
ILikeCheese:
    Console.WriteLine("MMM. Cheese is yummy.");
}
}

转向:

public static void Main(string[] args)
{
    bool flag = false;
    try
    {
        if (DateTime.Now < DateTime.MaxValue)
        {
            flag = Environment.NewLine != "\t";
        }
        else
        {
            return;
        }
    }
    finally
    {
        if (flag)
        {
            Console.WriteLine("Test Me Deeply");
        }
    }
    Console.WriteLine("MMM. Cheese is yummy.");
}

答案 2 :(得分:0)

goto cant_reach_me;

try{
cant_reach_me:
}
catch{}
  

这是编译或运行时错误,我不记得了。标签必须在try / catch块之外