递归函数从上一次递归迭代中读取旧值

时间:2018-08-12 02:50:22

标签: c# recursion

此代码段从控制台读取输入并返回一个对象。 如果有任何错误,它将再次调用自身。

我有验证规则来检查输入值是否不是字母。我的验证程序正在返回该错误,然后再次调用此函数以获取正确的输入。

以下代码的问题是:

  • 当我输入错误时,我们说“ abc”。
  • Validator返回错误并在控制台上打印出来并要求 新输入。
  • 现在,当我提交正确的输入(例如12)时,它会抛出一个 解析char Array期间发生FormatException。行: Int32.Parse(positionXY[0].ToString())

我该如何解决?

public MissileCoordinates ReadCoordinates()
{
    PrintLine($"Enter Coordinates", ConsoleColor.White);
    var move = Console.ReadLine();
    List<string> errors = constraintValidator.ValidateMissile(move).ToList();

    if (errors.Any())
    {
        foreach (var error in errors)
        {
            PrintLine(error, ConsoleColor.White);
        }
        ReadCoordinates();
    }
    else
    {
        var positionXY = move.ToCharArray();

        return new MissileCoordinates
        {
            PosX = Int32.Parse(positionXY[0].ToString()),
            PosY = Int32.Parse(positionXY[1].ToString())
        };
    }
    return null;
}

1 个答案:

答案 0 :(得分:1)

您的递归函数应该是:

public MissileCoordinates ReadCoordinates()
{
    PrintLine($"Enter Coordinates", ConsoleColor.White);
    var move = Console.ReadLine();
    List<string> errors = constraintValidator.ValidateMissile(move).ToList();

    if (errors.Any())
    {
        foreach (var error in errors)
        {
            PrintLine(error, ConsoleColor.White);
        }
        return ReadCoordinates();
    }
    else
    {
        var positionXY = move.ToCharArray();

        return new MissileCoordinates
        {
            PosX = Int32.Parse(positionXY[0].ToString()),
            PosY = Int32.Parse(positionXY[1].ToString())
        };
    }
}

这是小提琴https://dotnetfiddle.net/kbrP4u