{"record":{"id":"83f431183cd1a842","repo":"dotnet/reactive","slug":"throw-new-argumentnullexception-nameof-observer-return","errorCode":null,"errorMessage":"throw new ArgumentNullException(nameof(observer));","messagePattern":"throw new ArgumentNullException\\(nameof\\(observer\\)\\);","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Return.cs","lineNumber":33,"sourceCode":"        }\n\n        public static IAsyncObservable<TSource> Return<TSource>(TSource value, IAsyncScheduler scheduler)\n        {\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return Create<TSource>(observer => AsyncObserver.Return(observer, value, scheduler));\n        }\n    }\n\n    public partial class AsyncObserver\n    {\n        public static ValueTask<IAsyncDisposable> Return<TSource>(IAsyncObserver<TSource> observer, TSource value) => Return(observer, value, ImmediateAsyncScheduler.Instance);\n\n        public static ValueTask<IAsyncDisposable> Return<TSource>(IAsyncObserver<TSource> observer, TSource value, IAsyncScheduler scheduler)\n        {\n            if (observer == null)\n                throw new ArgumentNullException(nameof(observer));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return scheduler.ScheduleAsync(async ct =>\n            {\n                if (ct.IsCancellationRequested)\n                    return;\n\n                await observer.OnNextAsync(value).RendezVous(scheduler, ct);\n\n                if (ct.IsCancellationRequested)\n                    return;\n\n                await observer.OnCompletedAsync().RendezVous(scheduler, ct);\n            });\n        }\n    }\n}","sourceCodeStart":15,"sourceCodeEnd":51,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Return.cs#L15-L51","documentation":"AsyncObserver.Return(observer, value, scheduler) writes the single value to the given observer. A null observer gives the scheduled emission no destination, so ArgumentNullException is thrown before the scheduler is touched. It is a defensive guard against a wiring bug.","triggerScenarios":"Calling AsyncObserver.Return<TSource>(null, value) or AsyncObserver.Return<TSource>(null, value, scheduler) — first argument null.","commonSituations":"Observer obtained from a previous operator's output stored in a nullable field; a subscription helper that forgot to create the observer; passing the result of a method that can return null instead of a real observer.","solutions":["Pass a non-null IAsyncObserver<TSource> as the observer argument.","Use the higher-level AsyncObservable.Return(value) operator, which wires the observer for you.","Fix the observer-producing code path that returns null."],"exampleFix":"// before\nAsyncObserver.Return(observer, value); // observer null\n// after\nvar stream = AsyncObservable.Return(value); // let the library wire the observer\nawait stream.SubscribeAsync(myObserver);","handlingStrategy":"validation","validationCode":"if (observer == null) throw new InvalidOperationException(\"observer required for AsyncObserver.Return\");\nawait AsyncObserver.Return(observer, value);","typeGuard":"static bool HasObserver<TSource>(IAsyncObserver<TSource> o) => o is not null;","tryCatchPattern":"try { await AsyncObserver.Return(observer, value); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"observer\") { /* rebuild observer or use AsyncObservable.Return */ }","preventionTips":["Prefer the high-level AsyncObservable.Return(value) operator over manual observer wiring.","Never accept IAsyncObserver parameters that may be null in helper methods.","Keep observer creation and use in the same scope."],"tags":["argument-null","async-rx","return-operator","validation"],"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"}