以下は大丈夫です:
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);
}
(議論のために)WriteLine
tryブロック内の呼び出しのいずれかによって例外がスローされたと仮定します。catch
ブロックで実行を続けることの問題は何ですか?
もちろん、yield return部分は(現在のところ)何もスローすることができませんが、なぜそれが原因で、try
/のcatch
前または後にスローされた例外を処理するための囲み/ を持つことができないのyield return
ですか?
更新:ここにエリック・リッパートからの興味深いコメントがあります -彼らはすでにtry / finally動作を正しく実装するのに十分な問題を抱えているようです!
編集:このエラーに関するMSDNページはhttp://msdn.microsoft.com/en-us/library/cs1x15az.aspxです。ただし、その理由は説明されていません。