1

我们正在为IAsyncEnumerable. 我们的最终目标是能够使用System.Linq.Async. 不幸的是,当前的命名空间冲突使我们无法这样做。与此同时,我们正在编写自己的代码并尝试尽可能地符合他们的签名,以使换入/换出尽可能容易。

我们注意到一种模式,但不知道为什么它是一件事或它是否重要。考虑以下两个函数。

    public static IAsyncEnumerable<TSource> Concat<TSource>(this IAsyncEnumerable<TSource> source, IAsyncEnumerable<TSource> sequence) {
        return Core(source, sequence);
        static async IAsyncEnumerable<TSource> Core(IAsyncEnumerable<TSource> source, IAsyncEnumerable<TSource> sequence) {
            await foreach (var item in source) {
                yield return item;
            }
            await foreach (var item in sequence) {
                yield return item;
            }
        }
    }

    public static async IAsyncEnumerable<TSource> ConcatAsync<TSource>(this IAsyncEnumerable<TSource> source, IAsyncEnumerable<TSource> sequence) {
        await foreach (var item in source) {
            yield return item;
        }
        await foreach (var item in sequence) {
            yield return item;
        }
    }

System.Linq.Async在大多数/所有扩展中使用前者。我们不知道为什么会这样。为什么不像前者那样简单地写呢?最终,这两者之间有什么区别?一个似乎只是简单地包装另一个以async从签名中删除。我们使用 C#9 作为上下文。我们应该使用哪个,为什么?

4

0 回答 0