dotnet/reactive · error · ArgumentNullException

Value cannot be null. (Parameter 'observer')

Error message

Value cannot be null. (Parameter 'observer')

What it means

On the AsyncObserver side, the three-delegate Generate convenience method (observer, initialState, condition, iterate, resultSelector) first validates the target IAsyncObserver. When observer is null, the guard at AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs:190 throws ArgumentNullException('observer'). An observer is required because Generate exists only to push generated values somewhere; there is no valid subscription without one.

Solutions

  1. Ensure the IAsyncObserver passed in is non-null before calling AsyncObserver.Generate.
  2. In custom Subscribe implementations, throw ArgumentNullException(nameof(observer)) yourself at the entry point.
  3. Trace where the observer comes from (e.g. AsyncObservable.Create) and fix the stage producing null.

Example fix

// before
await AsyncObserver.Generate(observer, 0, c, i, s);
// after
if (observer == null) throw new ArgumentNullException(nameof(observer));
await AsyncObserver.Generate(observer, 0, c, i, s);
Defensive patterns

Strategy: validation

Validate before calling

if (observer is null) throw new ArgumentNullException(nameof(observer));
await AsyncObserver.Generate(observer, 0, cond, step, sel);

Type guard

static bool HasObserver<TResult>(IAsyncObserver<TResult> o) => o is not null;

Try / catch

try { await AsyncObserver.Generate(observer, 0, cond, step, sel); }
catch (ArgumentNullException ex) when (ex.ParamName == "observer") { /* fix the pipeline stage producing a null observer */ }

Prevention

When it happens

Trigger: Calling AsyncObserver.Generate<TState,TResult>(null, initialState, condition, iterate, resultSelector), usually from custom operator plumbing where the downstream observer variable was never assigned or a subscription factory returned null.

Common situations: Writing a custom IAsyncObservable whose Subscribe implementation passes through an observer obtained from Create(...) plumbing that can be null; composing operators where an earlier stage returned null instead of throwing; unit tests constructing observers lazily.

Related errors


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

Appendix: source

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

            if (iterate == null)
                throw new ArgumentNullException(nameof(iterate));
            if (resultSelector == null)
                throw new ArgumentNullException(nameof(resultSelector));
            if (timeSelector == null)
                throw new ArgumentNullException(nameof(timeSelector));
            if (scheduler == null)
                throw new ArgumentNullException(nameof(scheduler));

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

    public partial class AsyncObserver
    {
        public static ValueTask<IAsyncDisposable> Generate<TState, TResult>(IAsyncObserver<TResult> observer, TState initialState, Func<TState, bool> condition, Func<TState, TState> iterate, Func<TState, TResult> resultSelector)
        {
            if (observer == null)
                throw new ArgumentNullException(nameof(observer));
            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 Generate(observer, initialState, s => new ValueTask<bool>(condition(s)), s => new ValueTask<TState>(iterate(s)), s => new ValueTask<TResult>(resultSelector(s)), TaskPoolAsyncScheduler.Default);
        }

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

View on GitHub (pinned to 94b5d5ab91)