返回错误:并非所有代码路径都返回一个值

时间:2012-04-06 02:42:17

标签: c#

我正在尝试开发一种方法来检查用户输入,返回输入,如果它通过验证。

这就是我想要做的事情:

  1. 用户输入输入
  2. 检查输入值
  3. 如果输入满足逻辑,则返回该值,否则再次调用该函数。
  4. 真的我想要的是什么,但编译器指出not all code paths return a value

       public static int UserInput(){
       int input =  int.Parse(Console.ReadLine());
       if (input < 1 || input > 4){
           Console.Write("Invalid Selection. Enter a valid Number (1,2,3 or 4): ");
           if (input < 1 || input > 4)  UserInput();
    
       } else{
           return input; 
       }
    }
    

    但是,这是满足编译器的以下代码。

        public static int UserInput()
        {
           int input =  int.Parse(Console.ReadLine());
           if (input < 1 || input > 4)
           {
               Console.Write("Invalid Selection. Enter a valid Number (1,2,3 or 4): ");
    
               if (input < 1 || input > 4)
               {
                   UserInput();
                   return -1; // Never reached, but must be put in to satisfy syntax of C#
               }
               return input; // Never reached, but must be put in to satisfy syntax of C#
           }
           else
           {
               return input;
    
           }
        }
    

    这种作品,但我得到了奇怪的结果。如果用户要输入input,即第一次使用1,2,3或4(即if语句求值为false),则返回的输入为用户输入。但是,如果用户要输入的值 1,2,3或4 然后输入有效数字,那么程序将执行以下操作:

    1. 返回输入;
    2. 跳转到子if语句并运行UserInput();
    3. 然后返回-1。

2 个答案:

答案 0 :(得分:6)

你看起来需要return UserInput();。它看起来像recursive function,它会向下钻取并在底部返回,不断调用自己,直到满足令人满意的constaint为止。

你正在做的是向下钻取,让它返回一个值,然后返回-1。

您还通过再次检查输入来复制自己。看起来这可以归结为以下几点:

public static int UserInput()
{
   int input =  int.Parse(Console.ReadLine());
   if (input < 1 || input > 4)
   {
       Console.Write("Invalid Selection. Enter a valid Number (1,2,3 or 4): ");
       return UserInput();
   }
   else
       return input;
}

那么,将会发生的是,如果用户输入的号码无效,它将再次呼叫自己。如果他们然后输入有效数字。该方法将返回第一个调用,该调用将获取该值并将其返回到原始调用。

以下是使用它的递归调用的结果:

CallingMethod calls UserInput(0)
-UserInput(0)
--UserInput(5)
---UserInput(2) return 2
--UserInput(5) return 2
-UserInput(0) return 2
CallingMethod receives and uses 2

答案 1 :(得分:1)

为什么不简化以下内容(不需要else语句或第二个if)。另请注意,递归调用应返回以使其正常工作:

public static int UserInput()
{
   int input =  int.Parse(Console.ReadLine());
   if (input < 1 || input > 4)
   {
       Console.Write("Invalid Selection. Enter a valid Number (1,2,3 or 4): ");
       return UserInput(); //<--- problem was here
   }
   return input; 
}