2012-04-06 2 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; 

     } 
    } 

이런 종류의 작동하지만 이상한 결과가 나타납니다. 사용자가 첫 번째로 1,2,3 또는 4 중 하나 인 input에 입력 한 경우 (예 : if 문이 false으로 계산 됨) 사용자가 입력 한 내용이 반환됩니다.

  1. 리턴 입력; 사용자가 없습니다 1,2,3 또는 4 다음 유효한 숫자를 입력이었다 값을 입력하는 것이었다 경우, 다음 프로그램은 다음을 수행 할 것
  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

두 번째'if (input <1 || input> 4)' –

+0

@RogerStewart가 필요하지 않습니다. 더욱 단순화하도록 업데이트되었습니다. – Matt

관련 문제