在 C# 中的 try catch 中使用 yield
本文关键字:yield catch 中的 try | 更新日期: 2023-09-27 18:31:21
我知道我们不能根据文档在try-catch
块中使用yield
:
收益率回报语句不能位于 尝试捕获块。收益率回报语句可以在 try 中找到 阻止尝试最终语句。收益率中断语句可以是 位于 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-three-why-no-yield-in-finally.aspx
几乎是我想到的......但解释得比我做的要好得多:)