dotnet/reactive · error · ArgumentNullException

collectionSelector

Error message

collectionSelector

What it means

In the three-argument SelectMany overload, collectionSelector produces the inner observables; null is rejected because the per-element expansion cannot be computed. Fix: pass a non-null Func<TSource, IAsyncObservable<TCollection>>.

Solutions

  1. Pass a non-null Func<TSource, IAsyncObservable<TCollection>>.
  2. Flatten to the two-type-parameter SelectMany if only one projection is needed.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/SelectMany.cs:58 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15). Data as JSON: /api/errors/2f859e7931bdf8d5. Report an issue: GitHub.

Appendix: source

Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/SelectMany.cs:58

            return CreateAsyncObservable<TResult>.From(
                source,
                selector,
                static async (source, selector, observer) =>
                {
                    var (sink, inner) = AsyncObserver.SelectMany(observer, selector);

                    var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false);

                    return StableCompositeAsyncDisposable.Create(subscription, inner);
                });
        }

        public static IAsyncObservable<TResult> SelectMany<TSource, TCollection, TResult>(this IAsyncObservable<TSource> source, Func<TSource, IAsyncObservable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
        {
            if (source == null)
                throw new ArgumentNullException(nameof(source));
            if (collectionSelector == null)
                throw new ArgumentNullException(nameof(collectionSelector));
            if (resultSelector == null)
                throw new ArgumentNullException(nameof(resultSelector));

            return CreateAsyncObservable<TResult>.From(
                source,
                (collectionSelector, resultSelector),
                static async (source, state, observer) =>
                {
                    var (sink, inner) = AsyncObserver.SelectMany(observer, state.collectionSelector, state.resultSelector);

                    var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false);

                    return StableCompositeAsyncDisposable.Create(subscription, inner);
                });
        }

        public static IAsyncObservable<TResult> SelectMany<TSource, TCollection, TResult>(this IAsyncObservable<TSource> source, Func<TSource, ValueTask<IAsyncObservable<TCollection>>> collectionSelector, Func<TSource, TCollection, ValueTask<TResult>> resultSelector)
        {

View on GitHub (pinned to 94b5d5ab91)