{"record":{"id":"4b25de3d002640d1","repo":"dotnet/reactive","slug":"nameof-scheduler-observable-conversions","errorCode":null,"errorMessage":"nameof(scheduler)","messagePattern":"nameof\\(scheduler\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"Rx.NET/Source/src/System.Reactive/Linq/Observable.Conversions.cs","lineNumber":60,"sourceCode":"        /// <param name=\"observer\">Observer that will receive notifications from the enumerable sequence.</param>\n        /// <param name=\"scheduler\">Scheduler to perform the enumeration on.</param>\n        /// <returns>Disposable object that can be used to unsubscribe the observer from the enumerable</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"source\"/> or <paramref name=\"observer\"/> or <paramref name=\"scheduler\"/> is null.</exception>\n        public static IDisposable Subscribe<TSource>(this IEnumerable<TSource> source, IObserver<TSource> observer, IScheduler scheduler)\n        {\n            if (source == null)\n            {\n                throw new ArgumentNullException(nameof(source));\n            }\n\n            if (observer == null)\n            {\n                throw new ArgumentNullException(nameof(observer));\n            }\n\n            if (scheduler == null)\n            {\n                throw new ArgumentNullException(nameof(scheduler));\n            }\n\n            return s_impl.Subscribe(source, observer, scheduler);\n        }\n\n        #endregion\n\n        #region + ToEnumerable +\n\n        /// <summary>\n        /// Converts an observable sequence to an enumerable sequence.\n        /// </summary>\n        /// <typeparam name=\"TSource\">The type of the elements in the source sequence.</typeparam>\n        /// <param name=\"source\">An observable sequence to convert to an enumerable sequence.</param>\n        /// <returns>The enumerable sequence containing the elements in the observable sequence.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"source\"/> is null.</exception>\n        public static IEnumerable<TSource> ToEnumerable<TSource>(this IObservable<TSource> source)\n        {","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Rx.NET/Source/src/System.Reactive/Linq/Observable.Conversions.cs#L42-L78","documentation":"IEnumerable.Subscribe(source, observer, scheduler) throws ArgumentNullException when the IScheduler argument is null. The scheduler controls on which scheduler the enumeration runs; Rx requires a concrete scheduler and validates it last in the wrapper after source and observer.","triggerScenarios":"Calling source.Subscribe(observer, scheduler) with scheduler == null — e.g. a scheduler injected via an optional constructor parameter that defaulted to null, or Scheduler property not initialized.","commonSituations":"Happens when configuring test-vs-production schedulers through DI/config: a missing config key leaves the scheduler field null, and the error only surfaces when the subscription is set up.","solutions":["Pass a concrete scheduler such as Scheduler.Default, Scheduler.NewThread, or TaskPoolScheduler.Default.","Default null injected schedulers to Scheduler.Default at the consumption site.","Fix the DI/config registration so the IScheduler binding is always provided."],"exampleFix":"// before\nprivate IScheduler _scheduler; // left null by config\nsource.Subscribe(observer, _scheduler); // throws\n// after\nprivate IScheduler _scheduler = Scheduler.Default;\nsource.Subscribe(observer, _scheduler);","handlingStrategy":"validation","validationCode":"var sched = scheduler ?? Scheduler.Default;\nvar d = source.Subscribe(observer, sched);","typeGuard":"static bool HasScheduler(IScheduler? s) => s is not null;","tryCatchPattern":"try { var d = source.Subscribe(observer, scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { log.Error(\"Null scheduler; defaulting not applied\"); }","preventionTips":["Always coalesce injected schedulers: scheduler ?? Scheduler.Default.","Register a default IScheduler in DI so it is never absent.","When swapping schedulers for tests, ensure the test setup actually assigns them."],"tags":["rx","argumentnull","scheduler","null-check"],"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"}