以下は大丈夫です:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
ブロックは、すべての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);
}
(引数のために)tryブロック内のいずれかのWriteLine
呼び出しによって例外がスローされたと仮定します。catch
ブロックで実行を継続することの問題は何ですか?
もちろん、yield return部分は(現在)何もスローできませんが、なぜそれが、前後にスローされた例外を処理するためにtry
/を囲むことを停止する必要がありますか?catch
yield return
更新:ここにEricLippertからの興味深いコメントがあります-try / finalの動作を正しく実装するのにすでに十分な問題があるようです!
編集:このエラーに関するMSDNページは次のとおりです:http://msdn.microsoft.com/en-us/library/cs1x15az.aspx。ただし、その理由は説明されていません。