Warum kann Rendite nicht innerhalb eines try-Blocks mit einem catch angezeigt werden?

Das folgende ist in Ordnung:

try
{
    Console.WriteLine("Before");

    yield return 1;

    Console.WriteLine("After");
}
finally
{
    Console.WriteLine("Done");
}

Dasfinally Block wird ausgeführt, wenn die Ausführung des gesamten Objekts abgeschlossen ist IEnumerator<T> unterstütztIDisposable, um eine Möglichkeit bereitzustellen, dies auch dann sicherzustellen, wenn die Aufzählung vor ihrem Abschluss abgebrochen wird.

Aber das ist nicht in Ordnung:

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);
}

Angenommen (aus Gründen des Arguments), dass eine Ausnahme von dem einen oder anderen @ ausgelöst wirWriteLine ruft im try-Block auf. Was ist das Problem bei der Fortsetzung der Ausführung incatch Block

Natürlich kann der Yield Return-Teil (derzeit) nichts werfen, aber warum sollte uns das davon abhalten, ein umschließendes @ zu habetry/catch, um Ausnahmen zu behandeln, die vor oder nach einem @ ausgelöst wurdyield return?

Aktualisieren Dort ist eininteressanter Kommentar von Eric Lippert hier - Anscheinend haben sie bereits genug Probleme, das try / finally-Verhalten korrekt umzusetzen!

EDIT: Die MSDN-Seite mit diesem Fehler lautet:http: //msdn.microsoft.com/en-us/library/cs1x15az.asp. Es erklärt jedoch nicht, warum.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage