dotnet/reactive · error · ArgumentNullException

Value cannot be null. (Parameter 'resultSelector')

Error message

Value cannot be null. (Parameter 'resultSelector')

What it means

The scheduler-based Generate overload throws ArgumentNullException with parameter name 'resultSelector' when the state-to-result mapping delegate is null; the .NET runtime message is 'Value cannot be null. (Parameter 'resultSelector')'.

Solutions

  1. Pass a non-null selector, e.g. x => x.ToString(), as the fourth argument
  2. Match arguments to the (initialState, condition, iterate, resultSelector, scheduler) order
  3. Coalesce or validate the selector where it is produced rather than at the Generate call

Example fix

// before
AsyncObservable.Generate(0, x => x < 10, x => x + 1, null, Scheduler.Default);
// after
AsyncObservable.Generate(0, x => x < 10, x => x + 1, x => x, Scheduler.Default);
Defensive patterns

Strategy: validation

Validate before calling

if (resultSelector == null)
    throw new ArgumentNullException(nameof(resultSelector));
var obs = AsyncObservable.Generate(state, condition, iterate, resultSelector, scheduler);

Type guard

static bool HasResultSelector<TState, TResult>(Func<TState, TResult>? selector) => selector != null;

Try / catch

try
{
    var obs = AsyncObservable.Generate(state, condition, iterate, selector, scheduler);
}
catch (ArgumentNullException ex) when (ex.ParamName == "resultSelector")
{
    // fix argument order or provide the selector
}

Prevention

When it happens

Trigger: Calling AsyncObservable.Generate(initialState, condition, iterate, null, scheduler) — the fourth argument is null, frequently from positional confusion in the five-parameter overload.

Common situations: Optional selector arguments defaulting to null; argument lists assembled dynamically where the selector was skipped; copy-paste errors leaving a placeholder null.

Related errors


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

Appendix: source

Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs:31

        {
            if (condition == null)
                throw new ArgumentNullException(nameof(condition));
            if (iterate == null)
                throw new ArgumentNullException(nameof(iterate));
            if (resultSelector == null)
                throw new ArgumentNullException(nameof(resultSelector));

            return Create<TResult>(observer => AsyncObserver.Generate(observer, initialState, condition, iterate, resultSelector));
        }

        public static IAsyncObservable<TResult> Generate<TState, TResult>(TState initialState, Func<TState, bool> condition, Func<TState, TState> iterate, Func<TState, TResult> resultSelector, IAsyncScheduler scheduler)
        {
            if (condition == null)
                throw new ArgumentNullException(nameof(condition));
            if (iterate == null)
                throw new ArgumentNullException(nameof(iterate));
            if (resultSelector == null)
                throw new ArgumentNullException(nameof(resultSelector));
            if (scheduler == null)
                throw new ArgumentNullException(nameof(scheduler));

            return Create<TResult>(observer => AsyncObserver.Generate(observer, initialState, condition, iterate, resultSelector, scheduler));
        }

        public static IAsyncObservable<TResult> Generate<TState, TResult>(TState initialState, Func<TState, ValueTask<bool>> condition, Func<TState, ValueTask<TState>> iterate, Func<TState, ValueTask<TResult>> resultSelector)
        {
            if (condition == null)
                throw new ArgumentNullException(nameof(condition));
            if (iterate == null)
                throw new ArgumentNullException(nameof(iterate));
            if (resultSelector == null)
                throw new ArgumentNullException(nameof(resultSelector));

            return Create<TResult>(observer => AsyncObserver.Generate(observer, initialState, condition, iterate, resultSelector));
        }

View on GitHub (pinned to 94b5d5ab91)