Ce qui suit est correct:
try
{
    Console.WriteLine("Before");
    yield return 1;
    Console.WriteLine("After");
}
finally
{
    Console.WriteLine("Done");
}
Le finallybloc s'exécute lorsque le tout a fini de s'exécuter ( IEnumerator<T>prend IDisposableen charge pour fournir un moyen de garantir cela même lorsque l'énumération est abandonnée avant la fin).
Mais ce n'est pas correct:
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);
}
Supposons (pour des raisons d'argumentation) qu'une exception soit levée par l'un ou l'autre des WriteLineappels à l'intérieur du bloc try. Quel est le problème avec la poursuite de l'exécution en catchbloc?
Bien sûr, la partie yield return est (actuellement) incapable de lancer quoi que ce soit, mais pourquoi cela devrait-il nous empêcher d'avoir une clôture try/ catchtraiter les exceptions levées avant ou après un yield return?
Mise à jour: Il y a un commentaire intéressant d'Eric Lippert ici - il semble qu'ils aient déjà suffisamment de problèmes pour implémenter correctement le comportement try / finally!
EDIT: La page MSDN sur cette erreur est: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Cela n'explique cependant pas pourquoi.