dotnet/reactive · error · ArgumentNullException
Value cannot be null. (Parameter 'timeSelector')
Error message
Value cannot be null. (Parameter 'timeSelector')
What it means
Generate requires a timeSelector delegate that maps each state to the delay before the next element. When it is null, this overload throws ArgumentNullException immediately. This instance comes from the synchronous 5-parameter Generate overload (no scheduler).
Solutions
- Supply a non-null timeSelector, e.g. state => TimeSpan.FromMilliseconds(50).
- For constant delays, pass a lambda returning a fixed TimeSpan instead of null.
- Verify you are invoking the overload matching your delegate types (sync vs ValueTask-returning).
Example fix
// before var src = AsyncObservable.Generate(0, i => i < 5, i => i + 1, i => i, (Func<int, TimeSpan>)null); // after var src = AsyncObservable.Generate(0, i => i < 5, i => i + 1, i => i, _ => TimeSpan.FromSeconds(1));
Defensive patterns
Strategy: validation
Validate before calling
if (timeSelector is null) timeSelector = _ => TimeSpan.Zero; var src = AsyncObservable.Generate(initialState, condition, iterate, resultSelector, timeSelector);
Type guard
static bool HasTimeSelector<TState>(Func<TState,TimeSpan> t) => t != null;
Try / catch
try
{
var src = AsyncObservable.Generate(initialState, condition, iterate, resultSelector, timeSelector);
}
catch (ArgumentNullException ex) when (ex.ParamName == "timeSelector")
{
// substitute a default delay and retry construction
} Prevention
- Default the delay to TimeSpan.Zero at the call site instead of relying on the library.
- Keep timing lambdas near the Generate call, not in nullable remote config.
- Use named arguments to make every delegate slot explicit.
When it happens
Trigger: Calling AsyncObservable.Generate(initialState, condition, iterate, resultSelector, timeSelector) with timeSelector == null, typically because a TimeSpan-returning lambda was omitted or a null variable was passed.
Common situations: Dynamically composed pipelines where timing lambdas come from settings that failed to load; wrong overload picked (using the sync overload where the async ValueTask overload was intended) so the argument slot is null.
Related errors
- ArgumentNullException(nameof(keySelector))
- ArgumentNullException(nameof(observer))
- ArgumentNullException(nameof(source))
- ArgumentNullException(nameof(valueSelector))
- keySelector
AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15).
Data as JSON: /api/errors/3616effa588533fc.
Report an issue: GitHub.
Appendix: source
Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs:73
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, bool> condition, Func<TState, TState> iterate, Func<TState, TResult> resultSelector, Func<TState, TimeSpan> timeSelector)
{
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 (timeSelector == null)
throw new ArgumentNullException(nameof(timeSelector));
return Create<TResult>(observer => AsyncObserver.Generate(observer, initialState, condition, iterate, resultSelector, timeSelector));
}
public static IAsyncObservable<TResult> Generate<TState, TResult>(TState initialState, Func<TState, bool> condition, Func<TState, TState> iterate, Func<TState, TResult> resultSelector, Func<TState, TimeSpan> timeSelector, 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 (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));View on GitHub (pinned to 94b5d5ab91)