{"record":{"id":"aaa88c86cbb420d5","repo":"dotnet/reactive","slug":"argumentnullexception-nameof-scheduler","errorCode":null,"errorMessage":"ArgumentNullException(nameof(scheduler))","messagePattern":"ArgumentNullException\\(nameof\\(scheduler\\)\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.cs","lineNumber":548,"sourceCode":"        /// <param name=\"scheduler\">Scheduler to run the enumeration of the sequence of sources on.</param>\n        /// <returns>The observable sequence that merges the elements of the observable sequences.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"sources\"/> or <paramref name=\"scheduler\"/> is null.</exception>\n        /// <exception cref=\"ArgumentOutOfRangeException\"><paramref name=\"maxConcurrent\"/> is less than or equal to zero.</exception>\n        public static IObservable<TSource> Merge<TSource>(this IEnumerable<IObservable<TSource>> sources, int maxConcurrent, IScheduler scheduler)\n        {\n            if (sources == null)\n            {\n                throw new ArgumentNullException(nameof(sources));\n            }\n\n            if (maxConcurrent <= 0)\n            {\n                throw new ArgumentOutOfRangeException(nameof(maxConcurrent));\n            }\n\n            if (scheduler == null)\n            {\n                throw new ArgumentNullException(nameof(scheduler));\n            }\n\n            return s_impl.Merge(sources, maxConcurrent, scheduler);\n        }\n\n        /// <summary>\n        /// Merges elements from two observable sequences into a single observable sequence.\n        /// </summary>\n        /// <typeparam name=\"TSource\">The type of the elements in the source sequences.</typeparam>\n        /// <param name=\"first\">First observable sequence.</param>\n        /// <param name=\"second\">Second observable sequence.</param>\n        /// <returns>The observable sequence that merges the elements of the given sequences.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"first\"/> or <paramref name=\"second\"/> is null.</exception>\n        public static IObservable<TSource> Merge<TSource>(this IObservable<TSource> first, IObservable<TSource> second)\n        {\n            if (first == null)\n            {\n                throw new ArgumentNullException(nameof(first));","sourceCodeStart":530,"sourceCodeEnd":566,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.cs#L530-L566","documentation":"The Merge(IEnumerable<IObservable<TSource>>, int, IScheduler) overload throws ArgumentNullException when the scheduler argument is null. Rx requires an explicit IScheduler for this overload because scheduling governs how concurrent subscriptions are orchestrated.","triggerScenarios":"Calling Merge(sources, maxConcurrent, scheduler) where scheduler is null — commonly a field not yet assigned, a factory that returned null, or passing a dependency that was never injected.","commonSituations":"DI container misconfiguration where IScheduler was not registered; using a scheduler variable before initialization in tests; migrating code that removed Scheduler.Default.","solutions":["Pass a concrete scheduler such as Scheduler.Default, TaskPoolScheduler.Default, or CurrentThreadScheduler.Default.","If injection is used, verify the IScheduler registration in the DI container.","Coalesce with Scheduler.Default at the call site if a null scheduler is acceptable to treat as default.","Check initialization order so the scheduler field is assigned before Merge runs."],"exampleFix":"// before\nvar merged = sources.Merge(4, _scheduler); // _scheduler is null\n// after\nvar merged = sources.Merge(4, _scheduler ?? Scheduler.Default);","handlingStrategy":"validation","validationCode":"if (scheduler is null) scheduler = Scheduler.Default;","typeGuard":"static bool HasScheduler(IScheduler s) => s is not null;","tryCatchPattern":"try { var merged = sources.Merge(4, scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\")\n{\n    var merged = sources.Merge(4, Scheduler.Default);\n}","preventionTips":["Register IScheduler in your DI container so it can never resolve to null.","Default scheduler fields to Scheduler.Default at declaration.","Check initialization order in constructors and tests.","Avoid nullable scheduler parameters; require a scheduler explicitly."],"tags":["csharp","rx","argument-null","scheduler"],"backgroundTag":"null-argument","analyzedSha":"94b5d5ab912789f5abe9a72138a25bbd716fe59c","analyzedAt":"2026-09-15T02:26:24.759Z","contentChangedAt":"2026-09-15T02:26:24.759Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}