Isn’t the only real difference that the yield function is being passed into the iterator instead of being a reserved word? I don’t think it’s clunky, although it took a few minutes for me to get it.
No, before C# got generators, some of the machinery had to be manually implemented, with yeld, the compiler generates the necessary implementation for IEnumerable.
Compare that to yield return, .Select and .Where methods in C#, or Filter and Map in many popular languages - it's not a good look.
Or when writing manually, compare it to
Could also compare to how easy it is to use for extremely common patterns in general purpose code: