2012-04-06 7 views
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を返します。

答えて

6

あなたはそれを見てreturn UserInput();にする必要があります。それは単にrecursive functionのように見えます。このドリルダウンは、満足な結果が得られるまで継続的に呼び出すことで、下に戻ります。

何をしているのかは、ドリルダウンして、値を返すようにしてから、その上に-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 
+0

非常に感謝して、関数を返すことはできませんでした。 – dgamma3

+0

@ dgamma3はい、これは以下のような方法で切り捨てられます:int returnValue = UserInput(); return returnValue; .....これは本質的に何をしているのかです。関数から返された値を返すだけの関数を返すわけではありません。 –

1

はなぜ以下の(else文または第二の場合は必要ありません)に簡素化していない。ここで

は次のようにこれを使用して再帰呼び出しがどのように見えるかです。再帰呼び出しが正常に機能するように戻ってくることにも注意してください。

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; 
} 
+0

2番目の 'if(input <1 || input> 4)' –

+0

@RogerStewartは必要ありません。さらに簡素化するために更新されました。 – Matt

関連する問題