{"record":{"id":"c0ae820fb4d61b50","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-scheduler-range","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":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Range.cs","lineNumber":25,"sourceCode":"\nnamespace System.Reactive.Linq\n{\n    public partial class AsyncObservable\n    {\n        public static IAsyncObservable<int> Range(int start, int count)\n        {\n            if (count < 0 || ((long)start) + count - 1 > int.MaxValue)\n                throw new ArgumentOutOfRangeException(nameof(count));\n\n            return Create<int>(observer => AsyncObserver.Range(observer, start, count));\n        }\n\n        public static IAsyncObservable<int> Range(int start, int count, IAsyncScheduler scheduler)\n        {\n            if (count < 0 || ((long)start) + count - 1 > int.MaxValue)\n                throw new ArgumentOutOfRangeException(nameof(count));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return Create<int>(observer => AsyncObserver.Range(observer, start, count, scheduler));\n        }\n    }\n\n    public partial class AsyncObserver\n    {\n        public static ValueTask<IAsyncDisposable> Range(IAsyncObserver<int> observer, int start, int count) => Range(observer, start, count, TaskPoolAsyncScheduler.Default);\n\n        public static ValueTask<IAsyncDisposable> Range(IAsyncObserver<int> observer, int start, int count, IAsyncScheduler scheduler)\n        {\n            if (observer == null)\n                throw new ArgumentNullException(nameof(observer));\n            if (count < 0 || ((long)start) + count - 1 > int.MaxValue)\n                throw new ArgumentOutOfRangeException(nameof(count));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Range.cs#L7-L43","documentation":"AsyncObservable.Range(start, count, scheduler) requires an explicit IAsyncScheduler to schedule the emission of values. Passing null throws ArgumentNullException naming 'scheduler'. The library does not fall back to a default scheduler on this overload, so the caller must supply one (e.g. TaskPoolAsyncScheduler.Default).","triggerScenarios":"Calling AsyncObservable.Range(start, count, null) — typically when the scheduler is obtained from configuration, dependency injection, or a factory that returned null.","commonSituations":"DI container without a registered IAsyncScheduler; a config-driven scheduler lookup returning null; a helper method forwarding an optional scheduler parameter that defaulted to null; using this overload when the scheduler-less overload Range(start, count) was intended (it defaults to TaskPoolAsyncScheduler.Default).","solutions":["Pass a concrete scheduler such as TaskPoolAsyncScheduler.Default or NewThreadAsyncScheduler.Default.","If you don't need scheduler control, call the two-argument Range(start, count) overload instead.","Check why the scheduler variable is null (unregistered DI binding, failed config lookup) and fix the source.","Guard/require a non-null scheduler in your own wrapper API so the failure is caught earlier with a clear message."],"exampleFix":"// before\nvar xs = AsyncObservable.Range(0, 10, GetScheduler()); // GetScheduler() returned null\n// after\nvar sched = GetScheduler() ?? TaskPoolAsyncScheduler.Default;\nvar xs = AsyncObservable.Range(0, 10, sched);","handlingStrategy":"validation","validationCode":"if (scheduler == null) scheduler = TaskPoolAsyncScheduler.Default; // or throw with a clear message","typeGuard":"static bool HasScheduler(IAsyncScheduler s) => s is not null;","tryCatchPattern":"try { var xs = AsyncObservable.Range(start, count, scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { /* supply fallback scheduler or report config error */ }","preventionTips":["Default to TaskPoolAsyncScheduler.Default when no scheduler is configured.","Register IAsyncScheduler in your DI container.","Never forward possibly-null optional scheduler parameters without coalescing.","Use the parameterless-scheduler overload unless you need explicit control."],"tags":["null-argument","scheduler","reactive","argument-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"}