看起来C#编译器删除了对该方法的调用
不,它没有 - 这就是迭代器阻塞工作的方式.迭代器块中的代码只有MoveNext()在第一次调用时才会开始执行.如果你想确保整个方法被执行,你可以使用:
SomeIteratorMethod().Count();
Run Code Online (Sandbox Code Playgroud)
这将迭代整个序列,随着它去掉结果(而不是调用ToList例如,哪个会
如果你只想获得第一个yield语句,你可以使用
SomeIteratorMethod().Any();
Run Code Online (Sandbox Code Playgroud)
如果你想要一些代码总是执行(例如参数验证),但其余的应该是懒惰的,你需要用两种方法拆分方法:
public IEnumerable<Foo> SomeIteratorMethod(string mustNotBeNull)
{
if (mustNotBeNull == null)
{
throw ...
}
return SomeIteratorMethodImpl(mustNotBeNull);
}
private IEnumerable<Foo> SomeIteratorMethodImpl(string mustNotBeNull)
{
... yield new Foo()...
}
Run Code Online (Sandbox Code Playgroud)
或者你当然可以停止使用迭代器块.