{"record":{"id":"f10fac3b3d818b4d","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-observer-append","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'observer')","messagePattern":"Value cannot be null\\. \\(Parameter 'observer'\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Append.cs","lineNumber":265,"sourceCode":"            return Create<TSource>(\n                observer.OnNextAsync,\n                observer.OnErrorAsync,\n                async () =>\n                {\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","sourceCodeStart":247,"sourceCodeEnd":283,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Append.cs#L247-L283","documentation":"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.","triggerScenarios":"Calling AsyncObservable.Append(null, scheduler, values) with the observer argument null.","commonSituations":"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.","solutions":["Provide a valid IAsyncObserver<TSource> as the first argument.","Locate and fix the upstream null-producing observer source.","Guard the call site with a null check and meaningful error before constructing the operator."],"exampleFix":"// before\nAsyncObservable.Append(null, scheduler, new[] { 7 });\n// after\nAsyncObservable.Append(observer, scheduler, new[] { 7 });","handlingStrategy":"validation","validationCode":"if (observer is null) throw new InvalidOperationException(\"observer required.\");\nif (values is null) values = Enumerable.Empty<TSource>();\nif (scheduler is null) scheduler = AsyncScheduler.Default;\nvar (obs, disp) = AsyncObservable.Append(observer, scheduler, values);","typeGuard":"bool ValidArgs<T>(IAsyncObserver<T>? o, IEnumerable<T>? v, IAsyncScheduler? s) => o is not null && v is not null && s is not null;","tryCatchPattern":"try { var (obs, disp) = AsyncObservable.Append(observer, scheduler, values); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"observer\") { /* initialize observer, retry */ }","preventionTips":["Validate all three arguments (observer, scheduler, values) at the call boundary","Remember check order: observer is validated first, so fix it before other nulls","Use nullable reference types to trace where the null observer originates"],"tags":["argument-null","observer","scheduler","reactive"],"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"}