Dlaczego słowo kluczowe fed jest używane w połączeniu ze zwrotem i podziałem, a nie samo w sobie?

11

W języku C # możesz konstruować metody z typem zwracanym IEnumerable<T>i używać yield returnoraz yield breakkontrolować przepływ. Oto prosty przykład, który wykorzystuje obie kontrolki:

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

Moje pytanie brzmi: dlaczego pierwotnie zostało zaprojektowane, aby używać dwóch słów kluczowych yieldi nie używać go w następujący sposób z pojedynczym yield„zwracaniem wartości zwracanej”:

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.
    }        
}

Dla mnie jest to łatwiejsze do odczytania i zrozumienia.

Moop
źródło

Odpowiedzi:

13

Nieco niezręczna yield returnskładnia została utworzona , aby istniejący kod, który używał słowa „fed” jako identyfikatora (nazwy zmiennej), nie został złamany . (Na przykład, yieldjeśli pracujesz z kodem finansowym, ma sens nazywanie zmiennej ). Ponieważ „zwrot z zysków” był wtedy błędem składni, nowa składnia nie zepsuje żadnego istniejącego kodu.

Jeśli chodzi o yield break, nie mam pojęcia. To naprawdę nie ma żadnego uzasadnionego powodu, który mogę znaleźć.

Mason Wheeler
źródło
Czy wtedy yield x;też nie byłby błąd składniowy?
Moop
1
@Moop: Robiąc to yield return, nie musisz nawet niepokoić się myślami o tym, czy był to błąd składniowy, czy nie. Szansa na kolizję wynosi zero.
Robert Harvey
2
W przypadku „podziału dochodu;” jest to w zasadzie „powrót;” w metodzie void, ale używając „return;” w połączeniu z „zwrotem z zysków;” może być mylące. Zatem wybór „podziału dochodu” jest konsekwencją wyboru „zwrotu dochodu”.
Cyanfish,
3
@Moop, jeśli typ miałby nazwę, yieldto yield x;nie byłby to błąd składniowy, ale prawidłowa deklaracja zmiennej.
Bojan Resnik
1
@moop: Zobacz także ericlippert.com/2009/05/11/reserved-and-contextual-keyword i blogs.msdn.com/b/ericlippert/archive/2010/09/27/…, jeśli temat wprowadzenia nowych słów kluczowych bez złamanie dowolnego kodu Cię interesuje.
Eric Lippert,