{"record":{"id":"73fd2ec84e5cac61","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-scheduler-append","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'scheduler')","messagePattern":"Value cannot be null\\. \\(Parameter 'scheduler'\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Append.cs","lineNumber":269,"sourceCode":"                {\n                    foreach (var value in values)\n                    {\n                        await observer.OnNextAsync(value).ConfigureAwait(false);\n                    }\n\n                    await observer.OnCompletedAsync().ConfigureAwait(false);\n                }\n            );\n        }\n\n        public static (IAsyncObserver<TSource>, IAsyncDisposable) Append<TSource>(IAsyncObserver<TSource> observer, IAsyncScheduler scheduler, IEnumerable<TSource> values)\n        {\n            if (observer == null)\n                throw new ArgumentNullException(nameof(observer));\n            if (values == null)\n                throw new ArgumentNullException(nameof(values));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            var d = new SingleAssignmentAsyncDisposable();\n\n            return\n                (\n                    Create<TSource>(\n                        observer.OnNextAsync,\n                        observer.OnErrorAsync,\n                        async () =>\n                        {\n                            var task = await scheduler.ScheduleAsync(async ct =>\n                            {\n                                var e = default(IEnumerator<TSource>);\n\n                                try\n                                {\n                                    e = values.GetEnumerator();\n                                }","sourceCodeStart":251,"sourceCodeEnd":287,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Append.cs#L251-L287","documentation":"AsyncRx.NET's Append operator validates its arguments eagerly and throws ArgumentNullException when the scheduler parameter is null. Append needs a scheduler to emit the appended values on a controlled timeline, so a null scheduler makes the operator's contract unsatisfiable. The check happens at call time, not at subscription time.","triggerScenarios":"Calling ObservableExtensions.Append (the overload taking a scheduler, e.g. Append(source, values, scheduler) or Append(source, value, scheduler)) with scheduler passed as null, typically when the scheduler is sourced from a nullable field, config, or dependency injection that returned null.","commonSituations":"Dependency-injection container failing to register an IScheduler/AsyncScheduler implementation; a config lookup returning null for a scheduler name; passing the result of a helper method like GetScheduler() that returns null on failure; refactoring where the DefaultScheduler fallback was removed.","solutions":["Pass a concrete scheduler, e.g. AsyncScheduler.Default (or Scheduler.Default in the sync System.Reactive), instead of null.","If the scheduler comes from DI/config, verify registration and resolve it before calling Append, failing fast if null.","If the overload without a scheduler exists and immediate/implied scheduling is fine, call that overload instead.","Add a guard or default: scheduler ?? AsyncScheduler.Default at the call site."],"exampleFix":"// before\nvar result = source.Append(new[] { 4, 5 }, scheduler: null);\n\n// after\nvar result = source.Append(new[] { 4, 5 }, AsyncScheduler.Default);","handlingStrategy":"validation","validationCode":"if (scheduler == null)\n    throw new InvalidOperationException(\"scheduler must be configured before calling Append\");","typeGuard":"static bool HasScheduler(AsyncScheduler? s) => s is not null;","tryCatchPattern":"try\n{\n    var q = source.Append(values, scheduler);\n}\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\")\n{\n    // fall back to default scheduler or report config failure\n    var q = source.Append(values, AsyncScheduler.Default);\n}","preventionTips":["Register schedulers in DI and validate resolution at startup","Never pass nullable scheduler fields directly; coalesce with AsyncScheduler.Default","Prefer overloads without a scheduler when timing control is not needed"],"tags":["dotnet","asyncrx","argument-null","scheduler","append-operator"],"backgroundTag":"null-argument","analyzedSha":"94b5d5ab912789f5abe9a72138a25bbd716fe59c","analyzedAt":"2026-09-15T02:26:24.759Z","contentChangedAt":"2026-09-15T02:26:24.759Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}