Le mot-clé contextuel yield fait en réalité beaucoup de choses ici.
La fonction renvoie un objet qui implémente l'interface IEnumerable<object>. Si une fonction appelante commence à parcourir cet objet avec foreach, la fonction est rappelée jusqu'à ce qu'elle "cède". C'est du sucre syntaxique introduit dans C# 2.0. Dans les versions antérieures, il fallait créer ses propres objets IEnumerable et IEnumerator pour faire ce genre de choses.
La façon la plus simple de comprendre un tel code est de taper un exemple, de placer des points d'arrêt et de voir ce qui se passe. Essayez de parcourir pas à pas cet exemple :
public void Consumer()
{
for