根据文档,我知道我们不能yield
在块中使用:try-catch
yield return 语句不能位于 try-catch 块中。yield return 语句可以位于 try-finally 语句的 try 块中。yield break 语句可以位于 try 块或 catch 块中,但不能位于 finally 块中。
我也知道 Python 也有同样的限制。
我的问题是:为什么?
为什么这会导致编译器错误?是否有某种根本原因不允许这样做?
当您使用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-三个为什么最终没有收益.aspx
和我想的差不多..但解释得比我做的要好:)