以下是可以的:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
Run Code Online (Sandbox Code Playgroud)
该finally块在整个执行完毕后运行(IEnumerator<T>支持IDisposable提供一种方法来确保即使枚举在完成之前被放弃).
但这不是好事:
try
{
Console.WriteLine("Before");
yield return 1; // error CS1626: Cannot yield a value in the body of a try block with a catch clause
Console.WriteLine("After");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Run Code Online (Sandbox Code Playgroud)
假设(为了参数)WriteLinetry块中的一个或另一个调用抛出异常.在catch块中继续执行有什么问题?
当然,收益率回报部分(目前)无法抛出任何东西,但是为什么要阻止我们封闭try/ catch处理在之前或之后抛出的异常yield return?
更新:Eric Lippert在这里有一个有趣的评论 - 似乎他们已经有足够的问题正确实现try/finally行为!
编辑:此错误的MSDN页面是:http://msdn.microsoft.com/en-us/library/cs1x15az.aspx.但这并没有解释为什么.