1

次のコードでは、2 番目の初期化で 1 つの「外側」と 3 つの「内側」が出力されることがわかります。しかし、最初のものがまったく印刷されないのはなぜですか。「外側」に印刷されると思います。

        DeferExecution a = new DeferExecution(); // prints nothing 
        DeferExecution b = new DeferExecution(null); // print one "outside" and three "inside".

 class DeferExecution
{
    public IEnumerable<string> Input;

    public DeferExecution()
    {
        Input = GetIEnumerable();
    }

    public DeferExecution(string intput)
    {
        Input = GetIEnumerable().ToArray();
    }

    public IEnumerable<string> GetIEnumerable()
    {
        Console.WriteLine("outside");  
        var strings = new string[] {"a", "b", "c"};
        foreach (var s in strings)
        {
            Console.WriteLine("inside");  
            yield return s;
        }
    }
}
4

1 に答える 1

8

返される列挙型は、イテレータ ブロック(つまり、 を使用するメソッドyield) として実装されます。

反復子ブロック内のコードは、最初に列挙されるまで実際には実行されないため、実際にIEnumerable.

于 2013-01-25T22:57:43.497 に答える