C# 计算器错误中的C递归语句

C# 计算器错误中的C递归语句,c#,recursion,calculator,C#,Recursion,Calculator,我以前已经创建了一个简单的计算器,现在我正试图通过更多的内置错误处理来改进它。我试图调用一个函数来读取int,tryparsing,如果它在TryParse成功之前无法重新调用该函数 我的问题是false路径不返回值,因此它不会编译。我肯定有一个简单的步骤我错过了,谁能帮我一些建议?这个问题可以在GetNumber内解决吗?或者我应该在Main中有条件地调用函数?还有别的吗 using System; class Program { static int GetNumber()

我以前已经创建了一个简单的计算器,现在我正试图通过更多的内置错误处理来改进它。我试图调用一个函数来读取int,tryparsing,如果它在TryParse成功之前无法重新调用该函数

我的问题是false路径不返回值,因此它不会编译。我肯定有一个简单的步骤我错过了,谁能帮我一些建议?这个问题可以在GetNumber内解决吗?或者我应该在Main中有条件地调用函数?还有别的吗

using System;

class Program
{
    static int GetNumber()
    {
        Console.WriteLine("Enter a number");
        string entry = Console.ReadLine();

        int num;

        bool res = int.TryParse(entry, out num);

        if (res == true)
        {
            return num;
        }

        if (res == false)
        {
            Console.WriteLine("You did not enter a proper number");
            GetNumber();
        }
    }

    static void Main()
    {
        int x = GetNumber();
    }
}

在递归GetNumber之前添加一个return。这将在最终返回到主方法之前,将递归值返回到链中

您可以完整地删除第二个if语句,因为只有当res为false时才会出现。这不会影响功能,只是使其更易于阅读

static int GetNumber(){
    Console.WriteLine("Enter a number");
    string entry = Console.ReadLine();
    int num;
    bool res = int.TryParse(entry, out num);
    if (res == true){
        return num;
    }

    Console.WriteLine("You did not enter a proper number");
    return GetNumber();        
}

递归在这里没有帮助,您所需要的只是一个在输入有效数字时退出的循环。你不在乎以前的失败。递归很高兴地将它们堆积在调用堆栈上。旁白:对于退出的函数,有两个选项:使其返回可为null的类型,例如int?,如果没有有效输入,则返回null。这会使打电话的人的事情复杂化,但事情就是这样。2使用throw向调用方报告适当的异常。关于if语句:通常if-res足以测试布尔值的真值。不需要深入检查,例如res==true或res==true==true。在许多情况下,布尔值的另一个值是false,并且可以用else子句而不是独立的if语句轻松处理。我非常感谢您的反馈!关于你关于不需要递归的说法,我有一个问题。如果我要包含递归,那么重复输入非整数失败语句并让堆栈最终堆积太多东西,是否可能给我的程序带来问题?例如,如果有人向它提供一个字母或单词的永无止境的循环。是的,每个递归级别都需要额外的堆栈空间。在这种情况下,这可能不是一个现实的问题,也就是说,你没有为每个递归分配太多内存,一个生物可能会在几千次尝试后厌倦输入坏数据。当您需要保留现有状态时,递归非常有用,例如,当您尝试进行可能不太有效的移动时,棋盘上的棋子。您可以简单地备份几个步骤并返回到以前的状态。有些问题可以通过循环或递归巧妙地解决,例如计算数字的阶乘。