{"record":{"id":"ef06f63c74d38f3e","repo":"dotnet/reactive","slug":"throw-new-argumentnullexception-nameof-scheduler-return","errorCode":null,"errorMessage":"throw new ArgumentNullException(nameof(scheduler));","messagePattern":"throw new ArgumentNullException\\(nameof\\(scheduler\\)\\);","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Return.cs","lineNumber":20,"sourceCode":"// The .NET Foundation licenses this file to you under the MIT License.\n// See the LICENSE file in the project root for more information. \n\nusing System.Reactive.Concurrency;\nusing System.Threading.Tasks;\n\nnamespace System.Reactive.Linq\n{\n    public partial class AsyncObservable\n    {\n        public static IAsyncObservable<TSource> Return<TSource>(TSource value)\n        {\n            return Create<TSource>(observer => AsyncObserver.Return(observer, value));\n        }\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            {","sourceCodeStart":2,"sourceCodeEnd":38,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Return.cs#L2-L38","documentation":"AsyncObservable.Return(value, scheduler) emits a single value on the supplied IAsyncScheduler. Without a scheduler the value cannot be scheduled for emission, so a null scheduler triggers an immediate ArgumentNullException. This lets the developer find the bug at the calling line rather than deep in scheduling code.","triggerScenarios":"Calling AsyncObservable.Return<TSource>(value, null) — the scheduler overload invoked with a null IAsyncScheduler.","commonSituations":"A test scheduler variable not initialized; DI container missing an IAsyncScheduler registration; switching from the parameterless Return(value) (which uses ImmediateAsyncScheduler.Instance implicitly) to the overload and passing a null 'optional' scheduler.","solutions":["Pass a scheduler instance such as ImmediateAsyncScheduler.Instance, or use the single-argument Return(value) overload when no scheduling is needed.","Fix the scheduler factory/DI registration that returns null.","Default null schedulers: scheduler ?? ImmediateAsyncScheduler.Instance."],"exampleFix":"// before\nAsyncObservable.Return(42, testScheduler); // testScheduler null\n// after\nAsyncObservable.Return(42, testScheduler ?? ImmediateAsyncScheduler.Instance);","handlingStrategy":"validation","validationCode":"if (scheduler == null) scheduler = ImmediateAsyncScheduler.Instance;\nvar obs = AsyncObservable.Return(value, scheduler);","typeGuard":"static bool HasScheduler(IAsyncScheduler s) => s is not null;","tryCatchPattern":"try { var obs = AsyncObservable.Return(value, scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { /* fall back to ImmediateAsyncScheduler.Instance */ }","preventionTips":["Use the single-argument Return(value) when immediate emission is acceptable.","Centralize scheduler selection in one accessor that guarantees non-null.","Register IAsyncScheduler in DI with a concrete default implementation."],"tags":["argument-null","async-rx","return-operator","scheduler","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"}