1

ユーザー入力をチェックし、検証に合格した場合にのみ入力を返すメソッドを開発しようとしています。

これが私がやりたいことです:

  1. ユーザーが入力する
  2. 入力値の確認
  3. 入力がロジックを満たす場合はその値を返し、そうでない場合は関数を再度呼び出します。

これは本当に私が欲しいものですが、コンパイラは次のように述べてい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 を返します。
4

2 に答える 2

6

return UserInput();見た目からする必要があります。これは単純に再帰関数のように見えます。この関数は、満足のいく制約が満たされるまで自分自身を呼び出し続け、ドリルダウンして最下部に戻ります。

あなたがしているのは、ドリルダウンして値を返させ、その上に -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
于 2012-04-06T02:44:20.083 に答える
1

次のように簡略化してみませんか (else ステートメントや 2 番目の 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; 
}
于 2012-04-06T02:45:35.373 に答える