Por que a palavra-chave yield é usada em conjunto com return e break, e não por si só?

11

Em C #, você pode construir métodos com o tipo de retorno IEnumerable<T>e usar yield returne yield breakcontrolar o fluxo. Aqui está um exemplo simples que usa os dois controles:

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

Minha pergunta é: por que ele foi originalmente projetado para usar duas palavras-chave yielde não usá-lo como o seguinte com o único yield"produzindo o valor de retorno":

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

Para mim, isso é mais simples de ler e entender.

Moop
fonte

Respostas:

13

A yield returnsintaxe um pouco estranha foi criada para que o código existente que usasse a palavra "rendimento" como identificador (nome da variável) não fosse interrompido . (Faz sentido, por exemplo, ter uma variável chamada yieldse você estiver trabalhando com código financeiro.) Como "yield return" teria sido um erro de sintaxe na época, a nova sintaxe não quebraria nenhum código existente.

Quanto a yield break, não faço ideia. Isso realmente não parece ter nenhuma boa razão por trás disso que eu possa encontrar.

Mason Wheeler
fonte
yield x;Também não seria um erro de sintaxe na época?
Moop,
1
@Moop: Ao fazê-lo yield return, você nem precisa se preocupar em pensar se foi um erro de sintaxe ou não. A chance de uma colisão se torna zero.
Robert Harvey
2
Para "quebra de rendimento", é essencialmente como "retorno"; em um método nulo, mas usando "return"; em combinação com "retorno do rendimento"; pode ser confuso. Portanto, a escolha de "quebra de rendimento" é uma consequência da escolha de "retorno de rendimento".
Cyanfish
3
@Moop se você tivesse um tipo nomeado yield, yield x;não seria um erro de sintaxe, mas uma declaração de variável válida.
Bojan Resnik
1
@moop: consulte também ericlippert.com/2009/05/11/reserved-and-contextual-keywords and blogs.msdn.com/b/ericlippert/archive/2010/09/27/… se o assunto é a introdução de novas palavras-chave sem a quebra de qualquer código interessa a você.
Eric Lippert