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

  1. Supply a non-null timeSelector, e.g. state => TimeSpan.FromMilliseconds(50).
  2. For constant delays, pass a lambda returning a fixed TimeSpan instead of null.
  3. 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

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


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)