在C#中使用try catch中的yield

时间:2013-09-16 03:57:30

标签: c#

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

  

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

我也知道Python具有相同的limitation

我的问题是:为什么?

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

1 个答案:

答案 0 :(得分:2)

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

当您查看生成的内容时,您将看到编译器在MoveNext()块中包含对生成的类中的Currenttry..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

我想的很多......但解释得比我做得好得多:)