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
- Ensure the IAsyncObserver passed in is non-null before calling AsyncObserver.Generate.
- In custom Subscribe implementations, throw ArgumentNullException(nameof(observer)) yourself at the entry point.
- 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
- Throw ArgumentNullException at your Subscribe boundary before delegation.
- Ensure AsyncObservable.Create callbacks always return a real observer.
- Avoid storing observers in nullable fields that may be read before assignment.
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
- Value cannot be null. (Parameter 'observer')
- new ArgumentNullException(nameof(observer))
- Value cannot be null. (Parameter 'observer')
- Value cannot be null. (Parameter 'observer')
- Value cannot be null. (Parameter 'observer')
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)