Следующее нормально:
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 . Однако это не объясняет почему.