dotnet/reactive · error · ArgumentNullException

Value cannot be null. (Parameter 'observer')

Error message

Value cannot be null. (Parameter 'observer')

What it means

The overload Append(observer, IAsyncScheduler, IEnumerable<TSource> values) combines a forwarding observer, a scheduling context, and a values sequence; all three are required. The observer is checked first, so passing null there yields ArgumentNullException — in this file with the longer .NET message form "Value cannot be null. (Parameter 'observer')" — thrown from the public factory before subscription.

Solutions

  1. Provide a valid IAsyncObserver<TSource> as the first argument.
  2. Locate and fix the upstream null-producing observer source.
  3. Guard the call site with a null check and meaningful error before constructing the operator.

Example fix

// before
AsyncObservable.Append(null, scheduler, new[] { 7 });
// after
AsyncObservable.Append(observer, scheduler, new[] { 7 });
Defensive patterns

Strategy: validation

Validate before calling

if (observer is null) throw new InvalidOperationException("observer required.");
if (values is null) values = Enumerable.Empty<TSource>();
if (scheduler is null) scheduler = AsyncScheduler.Default;
var (obs, disp) = AsyncObservable.Append(observer, scheduler, values);

Type guard

bool ValidArgs<T>(IAsyncObserver<T>? o, IEnumerable<T>? v, IAsyncScheduler? s) => o is not null && v is not null && s is not null;

Try / catch

try { var (obs, disp) = AsyncObservable.Append(observer, scheduler, values); }
catch (ArgumentNullException ex) when (ex.ParamName == "observer") { /* initialize observer, retry */ }

Prevention

When it happens

Trigger: Calling AsyncObservable.Append(null, scheduler, values) with the observer argument null.

Common situations: Observer produced by a pipeline factory that returned null; class field initialized lazily and read too early; refactor swapping argument positions so null landed in the observer slot.

Related errors


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

Appendix: source

Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/Append.cs:265

            return Create<TSource>(
                observer.OnNextAsync,
                observer.OnErrorAsync,
                async () =>
                {
                    foreach (var value in values)
                    {
                        await observer.OnNextAsync(value).ConfigureAwait(false);
                    }

                    await observer.OnCompletedAsync().ConfigureAwait(false);
                }
            );
        }

        public static (IAsyncObserver<TSource>, IAsyncDisposable) Append<TSource>(IAsyncObserver<TSource> observer, IAsyncScheduler scheduler, IEnumerable<TSource> values)
        {
            if (observer == null)
                throw new ArgumentNullException(nameof(observer));
            if (values == null)
                throw new ArgumentNullException(nameof(values));
            if (scheduler == null)
                throw new ArgumentNullException(nameof(scheduler));

            var d = new SingleAssignmentAsyncDisposable();

            return
                (
                    Create<TSource>(
                        observer.OnNextAsync,
                        observer.OnErrorAsync,
                        async () =>
                        {
                            var task = await scheduler.ScheduleAsync(async ct =>
                            {
                                var e = default(IEnumerator<TSource>);

View on GitHub (pinned to 94b5d5ab91)