嵌套switch语句无法访问内部switch case C#

时间:2018-10-11 09:35:55

标签: c# nested switch-statement

我在程序中使用嵌套的switch语句。由于某种原因,内部switch语句似乎不起作用。

预期的行为:启动程序后,向用户显示5个选项; A: SUBJECTS, B: STUDENTS, C: ENROLMENT, D: GRADES_RECORD E: EXIT。在这些选项中,A,B,C和D包含其他switch语句。让我们以案例A: SUBJECTS为例。一旦选择了案例A,将为用户提供另外3个选项。 A: ADD_SUBJECTS, B: EDIT_SUBJECTS and C: DELETE_SUBJECTS。然后,用户选择这些选项之一,然后执行一些代码。举例来说,假设用户选择A,他将被引导完成向主题库添加主题的过程。

实际行为:启动程序后,显示初始提示A: SUBJECTS, B: STUDENTS, C: ENROLMENT, D: GRADES_RECORD E: EXIT,提示用户选择案例。用户选择案例后,将向他显示与已选择选项相关的第二个提示。例如。如果用户在初始提示符下选择A,则显示的第二个提示符为A: ADD_SUBJECTS, B: EDIT_SUBJECTS and C: DELETE_SUBJECTS。完美,这就是我希望它能起作用的方式。但这就是问题所在。现在,用户选择一个选项时,无论选择了哪个选项,程序都会像选择ADD_SUBJECT大小写一样工作,并执行相应的代码。这是针对父案例A: SUBJECTS。至于其余的父案例,则显示相关的子提示,但是子案例的任何输入/选择都会导致显示初始提示A: SUBJECTS, B: STUDENTS, C: ENROLMENT, D: GRADES_RECORD E: EXIT,它根本不会访问任何内部案例。

请参考以下代码:

   static void Main(string[] args)
        {
            Console.Title = "Students Record";
            LoadJson();
            Run();
        }

    static void Run()
    {
        while (true)
        {
            var consoleInput = ReadFromConsole(MainPrompt);
            if (string.IsNullOrWhiteSpace(consoleInput)) continue;

            Execute(consoleInput);
        }
    }

    public static string ReadFromConsole(string prompt)
    {
        Console.Write(prompt);
        return Console.ReadLine();
    }


static void Execute(string userChoice)
{        
switch(userChoice.ToUpper())
{
case A:
{
          ReadFromConsole(SubjectPrompt);

           switch (userChoice.ToUpper())
           {
              case "A"/*ADD_SUBJECT*/:
              {
                AddSubject();
                break;      
              }

               case "B"/*EDIT_SUBJECT*/:
               {
                  Console.WriteLine("edit subject");
                  break;
               }

               case "C"/*DELETE_SUBJECT*/:
               {
                   Console.WriteLine("delete subject");
                   break;
               }
         }
         break;
 }
case B:/*{some code}*/
case C:/*{some code}*/
case D:/*{some code}*/
case E:/*{some code}*/
}
}

案例B,C和D的格式相同。

有人能看到为什么对于父案例A总是提示添加主题,而不管选择了哪种案例,而对于其余父案例,它仅显示初始提示?

预先感谢

2 个答案:

答案 0 :(得分:3)

方法ReadFromConsole返回一个string,但您没有将其分配给userChoice,以保持输入方法时它的值。

case "A":
{
    userChoice = ReadFromConsole("Subject");

    switch (userChoice.ToUpper())
        case "A"/*ADD_SUBJECT*/:
        {
            AddSubject();
            break;
        }

        case "B"/*EDIT_SUBJECT*/:
        {
            Console.WriteLine("edit subject");
            break;
        }

        case "C"/*DELETE_SUBJECT*/:
        {
            Console.WriteLine("delete subject");
            break;
        }
    }
    break;
}

答案 1 :(得分:1)

在第二个switch语句中,变量 userChoice 仍等于“ A” ,只需擦除其值或创建一个新变量并将该新值传递给第二个切换:

...
var newInput = ReadFromConsole(SubjectPrompt);
switch (newInput.ToUpper())
{
  ...
}