转到 - 不在范围内(C#)

时间:2018-06-10 11:34:15

标签: c# goto

我对代码很新。任何人都可以通过简单的方式解释为什么我不能使用像这样的goto语句,让代码重新开始?或者,如何以正确的方式完成这项工作?而且,为什么我收到关于使用“静态”的错误消息。 ** “没有这样的标签”开始“在goto statmenet的范围内” “修饰符static对此项无效”

using System;


namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            Start:

            Random numberGenerator = new Random();

            int num1 = numberGenerator.Next(1,11);
            int num2 = numberGenerator.Next(1, 4);


            Console.WriteLine("What is " + num1 + " times " + num2 + "?");


            int svar = Convert.ToInt32(Console.ReadLine());

            if (svar == num1 * num2)
            {
                Console.WriteLine("well done!");
            }
            else
            {
                int responseIndex = numberGenerator.Next(1, 4);

                switch (responseIndex)
                {
                    case 1:
                        Console.WriteLine("Wrong, try again? [Y or N]");
                        AskUser();
                        break;
                    case 2:
                        Console.WriteLine("The answer was incorrect");
                        AskUser();
                        break;
                    default:
                        Console.WriteLine("You can do better than that");
                        AskUser();
                        break;
                }



                 static void AskUser() {
                    string jaellernei = Console.ReadLine().ToUpper();
                    if (jaellernei == "Y")
                    {
                     goto Start;
                    } else
                    {
                        return;
                    } }
            }


        }
    }
}

3 个答案:

答案 0 :(得分:8)

首先,您的AskUser方法错误地嵌套在另一个方法中 - 将其移出。

其次:goto仅在单个方法中有效 ;你可以跳转到一个堆栈帧 - 你不能在堆栈帧之间跳转

第三:您应该使用goto的次数......好吧,它不是 相当 零,但它渐近地接近零

答案 1 :(得分:1)

除非你必须,否则不要使用goto! 正如@Marc Gravell所说,它在一种方法中有效。

或者:您可以在Main方法中创建一个代码的方法,然后从main方法和使用goto语句的其他方法中调用它。 喜欢:

 using System;
namespace ConsoleApp3
{
    class Program

    {

        static void Main(string[] args)
        {
             someFunction();
        }


        static void someFunction()
        {
            Random numberGenerator = new Random();

            int num1 = numberGenerator.Next(1, 11);
            int num2 = numberGenerator.Next(1, 4);


            Console.WriteLine("What is " + num1 + " times " + num2 + "?");


            int svar = Convert.ToInt32(Console.ReadLine());

            if (svar == num1 * num2)
            {
                Console.WriteLine("well done!");
            }
            else
            {
                int responseIndex = numberGenerator.Next(1, 4);

                switch (responseIndex)
                {
                    case 1:
                        Console.WriteLine("Wrong, try again? [Y or N]");
                        AskUser();
                        break;
                    case 2:
                        Console.WriteLine("The answer was incorrect");
                        AskUser();
                        break;
                    default:
                        Console.WriteLine("You can do better than that");
                        AskUser();
                        break;
                }
            }
        }

        static void AskUser()
        {
            string jaellernei = Console.ReadLine().ToUpper();
            if (jaellernei == "Y")
            {
                someFunction();
            }
            else
            {
                return;
            }
        }


    }
}

答案 2 :(得分:0)

你可以这样做

public static Random randd = new Random();
public static void FlachCards()
{
Start:

    if (AskAUser() == "Y")
    {
        goto Start;
    }

}
public static String AskAUser()
{
    Console.WriteLine("Enter Y to play again");
    return Console.ReadLine();
}