2010-02-22 7 views
13

이것은 "나는 궁금하다"라는 질문에 불과합니다.
". 모든 코드 경로가 호환되는 값을 반환 할 수있는 nonvoid 반환 형식이있는 경우"C# -in-깊이 존 소총에서 - 감지 할 수없는 무한 루프를 만드는 방법은 무엇입니까?

람다 표현식에 대해 말한다 (페이지 233)

각주는 말한다 :
"예외를 던지는 코드 경로는 물론, 값을 반환해야하고, 어느 쪽도 감지 무한 루프를 수행하지 않습니다." (페이지 233)

무 탐지 루프가 무엇인지 궁금합니다.

논리로만 수행 할 수 있습니까? 또는 데이터베이스 또는 파일 시스템과 같은 외부 요인을 사용하여 수행됩니까?

+0

@ 존세트 어쩌면 그는 분명히 할 수 있습니다. –

답변

21

. 루프가 영원히 실행되는, 따라서 컴파일러는 수익에 도달되지 않습니다 것을보고 똑똑

while(true) { if (0 != 0) return 123; } 

과 : 컴파일러는 같은 매우 간단한 무한 루프를 감지 할 수 있습니다. 그것은 미친하지만, 법적, 대답 :없이

int M() { while(true) { } } 

int를 돌려 어떤 경로가 없지만, 또한 를 반환 어떤 경로가 없기 때문에

는 int를 반환!

컴파일러는 다른 종류의 무한 루프를 찾을만큼 똑똑하지 않습니다. 예 :

int x = 123; 
while(true) { if (x * 0 != 0) break; } 

이것은 분명히 무한 루프입니다. 그러나 컴파일러는 그것을 모릅니다. 컴파일러는 "음, 아마도 x * 0이 0이 아닌 x의 값이있을 수 있으므로 휴식 시간에 도달 할 수 있으므로 무한 루프가 아닙니다"라고 말합니다. 당신과 나는 수학을 알고 있기 때문에 이것이 불가능하다는 것을 알고 있지만, 컴파일러는 그렇지 않습니다.

자세한 내용은 8.1 절을 읽으십시오.

+3

나는 실제로 이것을 쓰는 것을 기억하지 않는다 - 각주가 당신의 영향 때문이라고 생각한다. :) –

+2

@ 존 : 원래 "예외를 던지는 코드 경로는 물론 값을 반환 할 필요가 없다"라고 썼다. 감지 할 수있는 무한 루프는 도달 할 수없는 끝점으로 간주됩니다. –

+2

맞아요 - 우리 각자가 더 자세하게 설명 할 가능성이 높습니다 :) –

3

외부 소스를 사용하거나 인터페이스와 같은 도구를 악용하여 무한 루프를 만드는 것은 매우 간단합니다. 예를 들어

:

public interface INumbers 
    { 
     int GetNumber(int arg); 
    } 
    public class StaticNumber : INumbers 
    { 
     public int GetNumber(int arg) 
     { 
      return 1; 
     } 
    } 
    public void DoStuff(INumbers num) 
    { 
     int i = 42; 
     while ((i = num.GetNumber(i)) != 0) 
     { 
      ; 
     } 
    } 

다음 존이 명세의 섹션 8.1에서 설명하는 참조 무엇 간단한

Action action =() => DoStuff(new StaticNumber()); 
관련 문제