Почему нельзя вернуть return в блоке try с уловом?
Следующее нормально:
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
блок?
Конечно, часть возврата дохода (в настоящее время) не может бросить что-либо, но почему это должно мешать нам иметь вложениеtry
/catch
иметь дело с исключениями, возникшими до или послеyield return
?
Обновить: Там естьИнтересный комментарий от Эрика Липперта здесь - кажется, у них уже достаточно проблем с реализацией поведения try / finally!
РЕДАКТИРОВАТЬ: страница MSDN на эту ошибку:http://msdn.microsoft.com/en-us/library/cs1x15az.aspx, Хотя это не объясняет почему.