【问题标题】:Use yield in try catch in C# [duplicate]在 C# 中的 try catch 中使用 yield [重复]
【发布时间】:2013-09-20 03:24:34
【问题描述】:

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

yield return 语句不能位于 尝试捕获块。一个 yield return 语句可以位于 try try-finally 语句的块。一个 yield break 语句可以是 位于 try 块或 catch 块中,但不是 finally 块。

我也知道 Python 也有同样的limitation

我的问题是:为什么?

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

【问题讨论】:

    标签: c#


    【解决方案1】:

    当您使用yield 时,编译器会生成一个完整的类来处理Iterator 模式的要求。

    当您查看生成的内容时,您会看到编译器将对生成类中的MoveNext()Current 方法的调用封装在try..finally 块中。毫无疑问,该要求是因为将导致try..finally 意大利面条,可能会阻止在生成的类上调用Dispose()。这将是一个值得避免的问题。它肯定会增加编译器的复杂性,以保证某些条件,例如上述条件。

    感谢 Chris(在这篇文章的 cmets 中)分享了 Eric Lippert 关于这个确切问题的博客文章:http://blogs.msdn.com/b/ericlippert/archive/2009/07/16/iterator-blocks-part-three-why-no-yield-in-finally.aspx

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

    【讨论】:

    猜你喜欢
    • 2012-11-25
    • 2011-12-21
    • 1970-01-01
    • 2010-10-31
    • 2017-08-22
    • 2016-05-22
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多