我正在尝试开发一种方法来检查用户输入,仅返回输入,如果它通过验证。
这就是我想要做的事情:
这真的我想要的是什么,但编译器指出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 然后输入有效数字,那么程序将执行以下操作:
答案 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;
}