0

根据文档,我知道我们不能yield在块中使用:try-catch

yield return 语句不能位于 try-catch 块中。yield return 语句可以位于 try-finally 语句的 try 块中。yield break 语句可以位于 try 块或 catch 块中,但不能位于 finally 块中。

我也知道 Python 也有同样的限制

我的问题是:为什么?

为什么这会导致编译器错误?是否有某种根本原因不允许这样做?

4

1 回答 1

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-三个为什么最终没有收益.aspx

和我想的差不多..但解释得比我做的要好:)

于 2013-09-16T04:05:08.190 回答