我知道根据文档,我们无法在yield
块中使用try-catch
:
yield return语句不能位于a try-catch块。 yield return语句可以位于try中 try-finally语句的块。 yield break语句可以是 位于try块或catch块中,但不是finally块。
我也知道Python具有相同的limitation。
我的问题是:为什么?
为什么会导致编译错误?是否有某种潜在的原因导致不允许这样做?
答案 0 :(得分:2)
当您使用yield
时,编译器会生成一个完整的类来处理Iterator
模式的要求。
当您查看生成的内容时,您将看到编译器在MoveNext()
块中包含对生成的类中的Current
和try..finally
方法的调用。这个要求无疑是因为try..finally
意大利面会产生,可能会阻止在生成的类上调用Dispose()
..这将是一个值得避免的问题。它肯定会增加编译器的复杂性,以保证某些条件,如上述条件。
感谢Chris(在这篇文章的评论中)与Eric Lippert的博客文章分享了这个问题:http://blogs.msdn.com/b/ericlippert/archive/2009/07/16/iterator-blocks-part-three-why-no-yield-in-finally.aspx
我想的很多......但解释得比我做得好得多:)