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
- Pass a non-null selector, e.g. x => x.ToString(), as the fourth argument
- Match arguments to the (initialState, condition, iterate, resultSelector, scheduler) order
- 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
- Double-check the five-parameter order before calling
- Use inline lambdas so nulls cannot slip in
- Add early validation wherever Generate arguments are assembled
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)