Я принимал ответ «Непобедимого Скита», пока кто-то из Microsoft не пришел, чтобы полить эту идею холодной водой. Но я не согласен с частью вопроса - конечно, правильный компилятор важнее, чем полный, но компилятор C # уже очень умен для того, чтобы разобраться в этом преобразовании для нас, насколько это возможно. Немного больше полноты в этом случае сделает язык более легким в использовании, обучении, объяснении, с меньшим количеством крайних случаев или ошибок. Поэтому я думаю, что это стоило бы дополнительных усилий. Несколько парней в Редмонде почесывают головы в течение двух недель, и в результате миллионы кодировщиков в течение следующего десятилетия могут немного расслабиться.
(Я также питаю противное желание, чтобы был способ заставить yield return
генерировать исключение, которое было вставлено в конечный автомат "извне", кодом, управляющим итерацией. Но мои причины для этого это довольно неясно.)
На самом деле, один мой вопрос об ответе Джона связан с бросанием выражения yield return.
Очевидно, что доходность 10 не так уж и плоха. Но это было бы плохо:
yield return File.ReadAllText("c:\\missing.txt").Length;
Так что не имеет ли смысла оценивать это внутри предыдущего блока try / catch:
case just_before_try_state:
try
{
Console.WriteLine("a");
__current = File.ReadAllText("c:\\missing.txt").Length;
}
catch (Something e)
{
CatchBlock();
goto case post;
}
return true;
Следующая проблема - вложенные блоки try / catch и переброшенные исключения:
try
{
Console.WriteLine("x");
try
{
Console.WriteLine("a");
yield return 10;
Console.WriteLine("b");
}
catch (Something e)
{
Console.WriteLine("y");
if ((DateTime.Now.Second % 2) == 0)
throw;
}
}
catch (Something e)
{
Console.WriteLine("Catch block");
}
Console.WriteLine("Post");
Но я уверен, что это возможно ...