C# Puzzle : Reachable goto pointing to an unreachable label

后端 未结 3 1524
予麋鹿
予麋鹿 2020-12-18 08:43

Here\'s Eric Lippert\'s comment from this post:

Now that you know the answer, you can solve this puzzle: write me a program in which there is a re

相关标签:
3条回答
  • 2020-12-18 09:33
    goto cant_reach_me;
    
    try{
    cant_reach_me:
    }
    catch{}
    

    This is either a compile or runtime error, I can not remember. The label must be outside the try/catch block

    0 讨论(0)
  • 2020-12-18 09:34

    My original answer:

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

    Here is without the compiler warning.

        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.");
    
    0 讨论(0)
  • 2020-12-18 09:43

    By the way if you use goto the csharp compiler for example for this case without finally block changes the code to a version without 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.");
    }
    }
    

    Turns To:

    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.");
    }
    
    0 讨论(0)
提交回复
热议问题