分享
三行代码  ›  专栏  ›  技术社区  ›  Rob Scott

递归方法在第二次迭代时返回0内锥虫

c#
  •  0
  • Rob Scott  · 技术社区  · 1 周前

    TryParse 若要失败,该方法将再次调用自身。当发生这种情况(第二次或任何其他事件)时,值始终为 0 . 当我使用 Enum.TryParse (不同的方法)以及,它返回 Enum

    // main method
    
    var currentRowNumber = GetSpaceNumber("Enter Number:");
    Console.WriteLine(currentRowNumber);  // will output "0" when any TryParse fails in below method
    

    private static int GetSpaceNumber(string instructions)
    {
         Console.WriteLine(instructions);
    
         int numberPassed;
    
         // tried assigning the "result" to a one liner from Console.ReadLine(), and using that variable in the TryParse method as well, same result
         if (!int.TryParse(Console.ReadLine(), out numberPassed))
         {
             GetSpaceNumber(instructions);
         }
    
         return numberPassed;
    }
    

    Output:
    
    Enter Number: 
    a  // this obviously fails and awaits another user input
    5  // from user input
    0  // from WriteLine in main method
    
    
    Working Example: (if the TryParse doesn't fail)
    
    Enter Number:
    5  // from user input
    5  // from WriteLine
    
    

    当我使用 以及(如上所述)

    public enum Example
    {
        Test1,
        Test2
    }
    

    // main method
    
    var currentPiceType = GetPieceType();
    Console.WriteLine(currentPiceType);
    
    private static PieceType GetPieceType()
    {
        Console.WriteLine("Enter Piece Type: Test1, Test2");
    
        PieceType result;
        if (!Enum.TryParse(Console.ReadLine(), out result))
        {
             GetPieceType();
        }
    
        return result;
    }
    

    Output:
    
    Enter Piece Type: Test1, Test2
    abc // from user input
    Test2 // from user input
    Test1 // from WriteLine()
    
    Working Example:
    
    Enter Piece Type: Test1, Test2
    Test2 // from user input
    Test2 // from WriteLine()
    

    我怎样才能以不同的方式编写代码(除非这是唯一的方法,否则不使用全局变量),以便在递归调用时从方法返回正确的值。另外,你能解释一下为什么会这样吗?

    2 回复  |  直到 1 周前
        1
  •  1
  •   TheGeneral    1 周前

    您需要从递归返回结果,否则即使验证通过,也不会返回结果

    private static int GetSpaceNumber(string instructions)
    {
         Console.WriteLine(instructions);
    
         int numberPassed;
    
         if (!int.TryParse(Console.ReadLine(), out numberPassed))
         {
             // here
             return GetSpaceNumber(instructions);
         }
    
         return numberPassed;
    }
    
        2
  •  1
  •   Guru Stron    1 周前

     if (!int.TryParse(Console.ReadLine(), out numberPassed))
     {
         return GetSpaceNumber(instructions); // add it here
     }