dotnet/reactive · error · ArgumentNullException
throw new ArgumentNullException(nameof(scheduler));
Error message
throw new ArgumentNullException(nameof(scheduler));
What it means
AsyncObservable.Return(value, scheduler) emits a single value on the supplied IAsyncScheduler. Without a scheduler the value cannot be scheduled for emission, so a null scheduler triggers an immediate ArgumentNullException. This lets the developer find the bug at the calling line rather than deep in scheduling code.
Solutions
- Pass a scheduler instance such as ImmediateAsyncScheduler.Instance, or use the single-argument Return(value) overload when no scheduling is needed.
- Fix the scheduler factory/DI registration that returns null.
- Default null schedulers: scheduler ?? ImmediateAsyncScheduler.Instance.
Example fix
// before AsyncObservable.Return(42, testScheduler); // testScheduler null // after AsyncObservable.Return(42, testScheduler ?? ImmediateAsyncScheduler.Instance);
Defensive patterns
Strategy: validation
Validate before calling
if (scheduler == null) scheduler = ImmediateAsyncScheduler.Instance; var obs = AsyncObservable.Return(value, scheduler);
Type guard
static bool HasScheduler(IAsyncScheduler s) => s is not null;
Try / catch
try { var obs = AsyncObservable.Return(value, scheduler); }
catch (ArgumentNullException ex) when (ex.ParamName == "scheduler") { /* fall back to ImmediateAsyncScheduler.Instance */ } Prevention
- Use the single-argument Return(value) when immediate emission is acceptable.
- Centralize scheduler selection in one accessor that guarantees non-null.
- Register IAsyncScheduler in DI with a concrete default implementation.
When it happens
Trigger: Calling AsyncObservable.Return<TSource>(value, null) — the scheduler overload invoked with a null IAsyncScheduler.
Common situations: A test scheduler variable not initialized; DI container missing an IAsyncScheduler registration; switching from the parameterless Return(value) (which uses ImmediateAsyncScheduler.Instance implicitly) to the overload and passing a null 'optional' scheduler.
Related errors
- throw new ArgumentNullException(nameof(observer));
- nameof(scheduler)
- Argument cannot be null (Parameter name: scheduler)
- new ArgumentNullException(nameof(timeSelector))
- new ArgumentNullException(nameof(scheduler))
AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15).
Data as JSON: /api/errors/ef06f63c74d38f3e.
Report an issue: GitHub.
Appendix: source
Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/Return.cs:20
// The .NET Foundation licenses this file to you under the MIT License.
// See the LICENSE file in the project root for more information.
using System.Reactive.Concurrency;
using System.Threading.Tasks;
namespace System.Reactive.Linq
{
public partial class AsyncObservable
{
public static IAsyncObservable<TSource> Return<TSource>(TSource value)
{
return Create<TSource>(observer => AsyncObserver.Return(observer, value));
}
public static IAsyncObservable<TSource> Return<TSource>(TSource value, IAsyncScheduler scheduler)
{
if (scheduler == null)
throw new ArgumentNullException(nameof(scheduler));
return Create<TSource>(observer => AsyncObserver.Return(observer, value, scheduler));
}
}
public partial class AsyncObserver
{
public static ValueTask<IAsyncDisposable> Return<TSource>(IAsyncObserver<TSource> observer, TSource value) => Return(observer, value, ImmediateAsyncScheduler.Instance);
public static ValueTask<IAsyncDisposable> Return<TSource>(IAsyncObserver<TSource> observer, TSource value, IAsyncScheduler scheduler)
{
if (observer == null)
throw new ArgumentNullException(nameof(observer));
if (scheduler == null)
throw new ArgumentNullException(nameof(scheduler));
return scheduler.ScheduleAsync(async ct =>
{View on GitHub (pinned to 94b5d5ab91)