无法使用yield return打印到控制台

hen*_*iny 4 .net c# yield-return

在下面的测试中,我无法在使用yield return时真正打印Console.WriteLine.我正在尝试收益率回报,我理解我对它的理解中缺少了一些东西,但却无法弄清楚它是什么.为什么不打印里面的字符串PrintAllYield

码:

class Misc1 {
    public IEnumerable<string> PrintAllYield(IEnumerable<string> list) {
        foreach(string s in list) {
            Console.WriteLine(s); // doesn't print 
            yield return s;
        }
    }
    public void PrintAll(IEnumerable<string> list) {
        foreach(string s in list) {
            Console.WriteLine(s); // surely prints OK
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试:

[TestFixture]
class MiscTests {
    [Test]
    public void YieldTest() {
        string[] list = new[] { "foo", "bar" };
        Misc1 test = new Misc1();

        Console.WriteLine("Start PrintAllYield");
        test.PrintAllYield(list);
        Console.WriteLine("End PrintAllYield");

        Console.WriteLine();

        Console.WriteLine("Start PrintAll");
        test.PrintAll(list);
        Console.WriteLine("End PrintAll");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Start PrintAllYield
End PrintAllYield

Start PrintAll
foo
bar
End PrintAll

1 passed, 0 failed, 0 skipped, took 0,39 seconds (NUnit 2.5.5).
Run Code Online (Sandbox Code Playgroud)

dle*_*lev 11

您必须实际枚举返回IEnumerable以查看输出:

    Console.WriteLine("Start PrintAllYield");
    foreach (var blah in test.PrintAllYield(list))
        ; // Do nothing
    Console.WriteLine("End PrintAllYield");
Run Code Online (Sandbox Code Playgroud)

使用yield return关键字时,编译器将为您构造状态机.它的代码只有在您实际使用它来迭代返回的可枚举时才会运行.

您是否有特殊原因yield return要打印出一系列strings?这并不是该功能的目的,即简化序列生成器的创建,而不是已经生成的序列的枚举.foreach是后者的首选方法.