在 C# 中的 try catch 中使用 yield

本文关键字:yield catch 中的 try | 更新日期: 2023-09-27 18:31:21

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

收益率回报语句不能位于 尝试捕获块。收益率回报语句可以在 try 中找到 阻止尝试最终语句。收益率中断语句可以是 位于 try 块或 catch 块中,但不是 finally 块。

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

我的问题是:为什么?

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

在 C# 中的 try catch 中使用 yield

当你使用 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

几乎是我想到的......但解释得比我做的要好得多:)