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