dotnet/reactive · error · ArgumentNullException

Value cannot be null. (Parameter 'observer')

Error message

Value cannot be null. (Parameter 'observer')

What it means

The AsyncObserver.Repeat(observer, value) factory (used to build async observers) requires a non-null IAsyncObserver<TSource> and throws ArgumentNullException with Parameter 'observer' when violated. Custom operator authors calling these low-level AsyncObserver factories must supply the downstream observer they were handed.

Solutions

  1. Pass the observer instance supplied to your SubscribeAsync/Subscribe implementation
  2. Check DI/factory wiring that should have provided the observer
  3. Ensure your custom operator forwards the observer parameter rather than dropping it
  4. If constructing standalone, create an observer (e.g. via AsyncObserver.Create) instead of passing null

Example fix

// before
public ValueTask<IAsyncDisposable> SubscribeAsync(IAsyncObserver<int> observer)
    => AsyncObserver.Repeat(null, 42);
// after
public ValueTask<IAsyncDisposable> SubscribeAsync(IAsyncObserver<int> observer)
    => AsyncObserver.Repeat(observer, 42);
Defensive patterns

Strategy: validation

Validate before calling

if (observer is null) throw new ArgumentNullException(nameof(observer));
var disp = await AsyncObserver.Repeat(observer, value);

Type guard

bool IsValidObserver<TSource>(IAsyncObserver<TSource> o) => o is not null;

Try / catch

try { var disp = await AsyncObserver.Repeat(observer, value); }
catch (ArgumentNullException ex) when (ex.ParamName == "observer")
{
    // forward the real observer from Subscribe instead of null
}

Prevention

When it happens

Trigger: Implementing a custom async operator and calling AsyncObserver.Repeat(observer, value) or AsyncObserver.Repeat(observer, value, scheduler) with a null observer — typically because the custom SubscribeAsync implementation did not receive or forward a valid observer.

Common situations: Writing custom Rx operators; wiring observers through DI where the dependency was not registered; calling the observer factory outside a Subscribe pipeline where no observer exists.

Related errors


AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15). Data as JSON: /api/errors/77919a559bc903be. Report an issue: GitHub.

Appendix: source

Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/Repeat.cs:73

        {
            if (source == null)
                throw new ArgumentNullException(nameof(source));
            if (repeatCount < 0)
                throw new ArgumentNullException(nameof(repeatCount));

            return CreateAsyncObservable<TSource>.From(
                source,
                repeatCount,
                static (source, repeatCount, observer) => AsyncObserver.Repeat(observer, source, repeatCount));
        }
    }

    public partial class AsyncObserver
    {
        public static ValueTask<IAsyncDisposable> Repeat<TSource>(IAsyncObserver<TSource> observer, TSource value)
        {
            if (observer == null)
                throw new ArgumentNullException(nameof(observer));

            return Repeat(observer, value, TaskPoolAsyncScheduler.Default);
        }

        public static ValueTask<IAsyncDisposable> Repeat<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 =>
            {
                while (!ct.IsCancellationRequested)
                {
                    await observer.OnNextAsync(value).RendezVous(scheduler, ct);
                }
            });

View on GitHub (pinned to 94b5d5ab91)