{"record":{"id":"4a72a4272efe3fb7","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-scheduler-observable-creation","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'scheduler')","messagePattern":"Value cannot be null\\. \\(Parameter 'scheduler'\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"Rx.NET/Source/src/System.Reactive/Linq/Observable.Creation.cs","lineNumber":408,"sourceCode":"        {\n            if (condition == null)\n            {\n                throw new ArgumentNullException(nameof(condition));\n            }\n\n            if (iterate == null)\n            {\n                throw new ArgumentNullException(nameof(iterate));\n            }\n\n            if (resultSelector == null)\n            {\n                throw new ArgumentNullException(nameof(resultSelector));\n            }\n\n            if (scheduler == null)\n            {\n                throw new ArgumentNullException(nameof(scheduler));\n            }\n\n            return s_impl.Generate(initialState, condition, iterate, resultSelector, scheduler);\n        }\n\n        #endregion\n\n        #region + Never +\n\n        /// <summary>\n        /// Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n        /// </summary>\n        /// <typeparam name=\"TResult\">The type used for the <see cref=\"IObservable{T}\"/> type parameter of the resulting sequence.</typeparam>\n        /// <returns>An observable sequence whose observers will never get called.</returns>\n        public static IObservable<TResult> Never<TResult>()\n        {\n            return s_impl.Never<TResult>();\n        }","sourceCodeStart":390,"sourceCodeEnd":426,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Rx.NET/Source/src/System.Reactive/Linq/Observable.Creation.cs#L390-L426","documentation":"The scheduler-overload of Observable.Generate throws ArgumentNullException when the 'scheduler' argument is null. The overload needs an IScheduler to schedule each generation step; Rx checks it explicitly so the caller gets a precise error instead of an internal failure.","triggerScenarios":"Calling Observable.Generate<TState, TResult>(initialState, condition, iterate, resultSelector, null), e.g. a scheduler resolved from DI or a static field that is still null.","commonSituations":"Testing code where a scheduler mock was not registered; swapping Scheduler.Default for an injected scheduler that failed to resolve; initializing schedulers in a static ctor that ran out of order.","solutions":["Pass a real scheduler such as Scheduler.Default, TaskPoolScheduler.Default, or NewThreadScheduler.Default","Ensure the injected IScheduler is registered/resolved before use","Null-check the scheduler before calling"],"exampleFix":"// before\nObservable.Generate(0, c, i => i + 1, i => i, injectedScheduler) // injectedScheduler == null\n// after\nvar sched = injectedScheduler ?? Scheduler.Default;\nObservable.Generate(0, c, i => i + 1, i => i, sched)","handlingStrategy":"validation","validationCode":"if (scheduler == null) throw new ArgumentNullException(nameof(scheduler));\nvar sched = scheduler ?? Scheduler.Default;","typeGuard":"bool HasScheduler(IScheduler s) => s is not null;","tryCatchPattern":"try { Observable.Generate(state, cond, it, sel, sched); } catch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { /* fall back to Scheduler.Default */ }","preventionTips":["Register IScheduler in DI and fail fast at composition root","Use Scheduler.Default as a fallback default","Null-check injected schedulers before any Rx operator use"],"tags":["reactive","null-argument","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-15T23:17:13.987Z"}