The struct approach wouldn’t work. If you want to asynchronously return an IAsyncEnumerator<T>
value, you could use Task<IAsyncEnumerator<T>>
with return Bar();
. However, that would be unusual. It would be much more natural to create a new IAsyncEnumerator<T>
that incorporates await SomeAsyncMethod()
at the beginning of the asynchronous enumerable. To do this, you should use await
and yield
as suggested by your option (1):
public async IAsyncEnumerable<int> Foo()
{
await SomeAsyncMethod();
await foreach (var item in Bar())
yield return item;
}
On a side note, JavaScript has a very nice yield*
syntax for this kind of “enumerate this whole sequence into my result sequence” concept, and it supports both synchronous and asynchronous sequences. C# does not have this kind of syntax for either synchronous or asynchronous sequences.