Pourquoi le mot-clé yield est-il utilisé conjointement avec return et break, et pas seul?

11

En C #, vous pouvez construire des méthodes avec le type de retour IEnumerable<T>et utiliser yield returnet yield breakcontrôler le flux. Voici un exemple simple qui utilise les deux contrôles:

public IEnumerable<int> GetEvens(int start, int end) {
    if(end < start)
        yield break;

    if(start & 2 != 0)
        start++;

    for(int i = start; i <= end; i+=2) {
        yield return i;
    }        
}

Ma question est la suivante: pourquoi a-t-il été initialement conçu pour utiliser deux mots-clés avec yieldet non pas comme celui-ci avec le single yield"yielding the return value":

public IEnumerable<int> GetEvens(int start, int end) {
    if(end < start)
        return; // stop completely and return nothing

    if(start & 2 != 0)
        start++;

    for(int i = start; i <= end; i+=2) {
        yield i; // yield the current value.
    }        
}

Pour moi, c'est plus simple à lire et à comprendre.

Moop
la source

Réponses:

13

La yield returnsyntaxe légèrement maladroite a été créée pour que le code existant qui utilisait le mot "yield" comme identifiant (nom de variable) ne se casse pas . (Il est parfaitement logique, par exemple, d'avoir une variable nommée yieldsi vous travaillez avec du code financier.) Puisque "yield return" aurait été une erreur de syntaxe à l'époque, la nouvelle syntaxe ne casserait aucun code existant.

Quant à yield break, aucune idée. Cela ne semble vraiment pas avoir de raison valable derrière cela.

Mason Wheeler
la source
Ne serait-ce pas yield x;également une erreur de syntaxe à l'époque?
Moop
1
@Moop: En le faisant yield return, vous n'avez même pas à vous soucier de savoir s'il s'agissait d'une erreur de syntaxe ou non. Le risque de collision devient nul.
Robert Harvey
2
Pour "rendement cassé", c'est essentiellement comme "retour"; dans une méthode void, mais en utilisant "return;" en combinaison avec "rendement rendement"; pourrait être déroutant. Ainsi, le choix de la «rupture de rendement» est une conséquence du choix du «rendement de rendement».
Cyanfish
3
@Moop si vous aviez un type nommé yieldalors yield x;ne serait pas une erreur de syntaxe, mais une déclaration variable valide.
Bojan Resnik
1
@moop: Voir aussi ericlippert.com/2009/05/11/reserved-and-contextual-keywords et blogs.msdn.com/b/ericlippert/archive/2010/09/27/… si l'objet de l'introduction de nouveaux mots clés sans briser tout code vous intéresse.
Eric Lippert