2011-01-02 8 views
0

は、だから私のクラスの一つは、それがGetEnumeratorメソッドを必要としているためのIQueryableを実装したコードは次のようになります。コントロールは、最初の方法に入ったときにIEnumerableを<T> GetEnumeratorメソッド()exexcution

 public IEnumerator<T> GetEnumerator() 
     { 
      this.ParseExpression(this.expression); 
      return this.GetResults() 

     } 

     private IEnumerator<T> GetResults() 
     { 
       //Processes the expression tree. 

       T t = Activator.CreateInstance(typeof(T)); 
       yield return T; 
     } 

奇妙な部分は、それがスキップされます(GetResults()メソッドに入る前の中括弧)GetResults()メソッドは、クラスがIEnumerableを実装しているため、コンパイラによって暗黙的に実行されることを意味しますか?

答えて

4

いいえ、コンパイラによって追加されたコードが増えていることを意味します。それを表すソースコードはありません。

yieldを使用すると、コンパイラは列挙子の実装を作成します。 GetResultsを呼び出すと、実際にはメソッドが呼び出されず、代わりにその列挙子のコンストラクタが呼び出されます。これは、あなたのメソッドが初めて呼び出されたことを列挙子から読み始めるときです。

関連する問題