2015-01-08 1 views
-3

아래의 메서드에 문제가 있습니다. 내가 얻는 현재 오류는 "어떤 값도 반환하지 않습니다"입니다. 대괄호 밖에 num을 넣으면 현재 컨텍스트에 존재하지 않습니다. 나는 모두 함께 브래킷을 제거하면 내가 얻을 :메서드 내에서 임의의 rnd를 사용하면 여러 오류가 발생합니다.

내장 문은 내가이없이 전에 여러 방법을 수행 한

이름 'RND'는 현재 컨텍스트에 존재하지 않는 선언이나 표지 문 수 없습니다 발행물. 내가 뭘 놓치고 있니?

public static int generateNumber(int timesUserWantsToGuess) 
     { 
      for (int i = 0; i <= timesUserWantsToGuess; i++) 
      { 
       Random rnd = new Random(); 
       int num = rnd.Next(1, 50); 
       return num; 
      } 


     } 
+5

에 @ BradleyDotNET의 답변을 참조? 컴파일러는 단순히 그 가능성을 거부하고 있습니다. 첫 번째 오류를 먼저 수정하고 * 오류 메시지를 검색하십시오. – user2864740

+0

이 방법으로 무엇을하려합니까? 'timesUserWantsToGuess'가 0이면 루프는 값을 반환하지 않습니다. 'timesUserWantsToGuess'가> = 1이면 루프는 한 번만 수행됩니다. 그런 다음 반복 당 하나의 새로운 난수를 선언하는 것과 관련된 모든 문제가 있습니다. 이는 동일한 난수를 생성 할 가능성이 큽니다. – Cameron

+0

'timesUserWantsToGuess <0'의 경우도 고려하십시오.컴파일러는이 함수에 전달할 값이 올바르지 않음을 알 수있는 방법이 없습니다. –

답변

6

우선 의미 불일치가 있습니다. 하나의 int을 반환하지만 루프 내에서 실행하고 반환합니다.

public static IEnumerable<int> generateNumber(int timesUserWantsToGuess) 
{ 
    //Optional, but good error checking 
    if (timesUserWantsToGuess <= 0) 
     throw new ArgumentException("Invalid guess count"); 

    Random rnd = new Random(); 
    for (int i = 0; i < timesUserWantsToGuess; i++) 
    { 
     int num = rnd.Next(1, 50); 
     yield return num; 
    } 
} 

참고 순서에서 다음 개체를 반환하는 yield의 사용 : 당신이 실제로가 INT의 수집을 반환하고 싶었 경우

, 당신이 뭔가를 할 수 있습니다. 또한 동일한 값 (동일한 시드)이 생성되므로 좁은 루프에서 Random을 인스턴스화해서는 안됩니다. 또한 조건부에 <=을 사용하면 전달 된 값보다 하나 더 반복되므로, <으로 전환했습니다.

루프를 사용하지 않으려는 경우 루프를 제거하면 문제가 해결됩니다. 지금은 루프 의미론과 나머지 코드 불일치로 인해 문제가 발생합니다.

+0

빈번한 시퀀스를 반환하는 것보다는'timeUserWantsToGuess <0'에 대한 체크를 추가하고'InvalidOperationException'을 던지는 것이 가치가 있을지도 모른다. . –

+1

@MattBurland 합의했지만, ArgumentException을 사용합니다. 선택 사항으로 추가됨 – BradleyDotNET

0

루프 내부에 return 문이 있기 때문에 컴파일러는 블록을 실행하지 않고 실행할 수있는 기회가 있다고 가정하므로 반환하지 않습니다. timesUserWantsToGuess이 0보다 작은 경우 논리적으로 발생할 수 있습니다.이 경우에는 루프가 입력되지 않습니다. return 문이 블록 외부에있는 경우이 코드가 컴파일되는 이유는 블록 외부에 있기 때문에 어느 시점에서 실행이 return에 도달하거나 예외가 발생한다는 것을 보장하기 때문입니다.

당신은 C#을 (ifforforeach, lockwhile 모두가 내 지식이 작업을 수행)는 블록 (관례 들여 쓰기) 만 다음 줄이 포함되어 있는지 말에서 블록에 브라켓을 제거하는 경우 아무것도 더. 한 줄짜리 ("임베디드") 문장의 변수 선언은 구문 적으로는 다른 곳에서는 사용할 수 없기 때문에 컴파일러가이를 금지합니다. 블록을 괄호로 묶는 한 변수를 사용하지 않고 블록에서 변수를 선언 할 수도 있습니다.

마지막으로,이 같은 루프 중 하나의 값을 반환의 논리에 큰 의미 불일치가있다 : 때`timesUserWantsToGuess = 0` 어떻게됩니까 yield return

+2

'timesUserWantsToGuess'가 0보다 작 으면 실제로 for 루프 만 건너 뜁니다. – juharr

+0

@juharr 사실, 답변을 업데이트하겠습니다. – David

관련 문제