2009-03-06 26 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

私は、X2を削除して、Xのみを含む例を最小限に抑えました。 –

答えて

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()メソッドも公開する必要があります。そうしないと、他のアセンブリはクラスのMain()メソッドをアプリケーションの開始点として呼び出すことができません。

+0

他のアセンブリが私のmainメソッドを呼び出すのはなぜですか?私はその理由を考えることができません。 –

関連する問題