2009-03-06 4 views
4

아래의 내 X 메서드가 호출되지 않는 이유는 무엇입니까?C# 메서드가 호출되지 않는 이유는 무엇입니까?

static class Program 
{ 
    private static void Main() 
    { 
     X((IEnumerable<int>)null); 
    } 

    public static IEnumerable<T> X<T>(IEnumerable<T> e) 
    { 
     if (e == null) 
      throw new ArgumentNullException(); 
     yield break; 
    } 
} 

나는 디버거를 스테핑 시도하지만 X를 입력하지 않습니다! yield break 키워드가 인식하지 못하는 부작용이 있습니까?

가치가 있다면 .NET 3.5 SP1과 함께 Visual Studio 2008 Express를 사용하고 있습니다.

+0

저는 X 만 포함하고 X2를 제거하는 예제를 최소화했습니다. –

답변

13

X2는 반복자이며 지연 실행됩니다. 반환 된 IEnumerable 인스턴스에서 값을 가져올 때까지 실제로 실행되지 않습니다. 함수를 2 부분으로 나누면 실제로 원하는 동작을 얻을 수 있습니다.

public static IEnumerable<T> X2<T>(IEnumerable<T> e) 
    { 
     if (e == null) 
      throw new ArgumentNullException(); 
     return X2Helper(e); 
    } 

    private static IEnumerable<T> X2Helper<T>(IEnumerable<T> e) 
    { 
     yield break; 
    } 

에릭이 주제에 대한 좋은 블로그 게시물이 있습니다 http://blogs.msdn.com/ericlippert/archive/2008/09/08/high-maintenance.aspx

+0

오, 그 부분을 잊어 버렸습니다. 고맙습니다. –

1

IEnumerable에서의 GetEnumerator 메서드가 호출 될 때까지 예 메서드가 호출되지 않습니다.

0

Main() 메소드도 public이어야합니다. 그렇지 않으면 다른 어셈블리가 클래스의 Main() 메서드를 응용 프로그램의 시작 지점으로 호출 할 수 없습니다.

+0

왜 다른 어셈블리가 내 main 메소드를 호출하려고합니까? 나는 그 이유를 생각할 수 없다. –

관련 문제