{"record":{"id":"3501c0ea58e3f0d9","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-scheduler-buffer","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'scheduler')","messagePattern":"Value cannot be null\\. \\(Parameter 'scheduler'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Buffer.cs","lineNumber":70,"sourceCode":"                timeSpan,\n                static async (source, timeSpan, observer) =>\n                {\n                    var (sink, timer) = await AsyncObserver.Buffer(observer, timeSpan).ConfigureAwait(false);\n\n                    var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(subscription, timer);\n                });\n        }\n\n        public static IAsyncObservable<IList<TSource>> Buffer<TSource>(this IAsyncObservable<TSource> source, TimeSpan timeSpan, IAsyncScheduler scheduler)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (timeSpan < TimeSpan.Zero)\n                throw new ArgumentNullException(nameof(timeSpan));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return CreateAsyncObservable<IList<TSource>>.From(\n                source,\n                (timeSpan, scheduler),\n                static async (source, state, observer) =>\n                {\n                    var (sink, timer) = await AsyncObserver.Buffer(observer, state.timeSpan, state.scheduler).ConfigureAwait(false);\n\n                    var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(subscription, timer);\n                });\n        }\n\n        public static IAsyncObservable<IList<TSource>> Buffer<TSource>(this IAsyncObservable<TSource> source, TimeSpan timeSpan, TimeSpan timeShift)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Buffer.cs#L52-L88","documentation":"The Buffer(source, timeSpan, scheduler) overload throws ArgumentNullException when the scheduler parameter is null. This is a genuine null-reference guard: a scheduler is mandatory because the time-based buffering needs to schedule window timers. The library fails fast at call time, before any subscription.","triggerScenarios":"Calling source.Buffer(timeSpan, null) explicitly, or passing a scheduler field/property that was never initialized, or a factory method returning null.","commonSituations":"Dependency-injection container not yet initialized when the operator is constructed, a custom IAsyncScheduler implementation whose factory returns null on failure, or copy-pasted code where the scheduler argument was removed.","solutions":["Pass a valid scheduler, e.g. AsyncScheduler.Default (or the library's equivalent default scheduler).","If the scheduler comes from DI/configuration, assert it is non-null before building the query.","If a custom scheduler, verify its construction did not fail silently and return null."],"exampleFix":"// before\nvar buffer = source.Buffer(TimeSpan.FromSeconds(1), GetScheduler()); // GetScheduler() returned null\n// after\nvar sched = GetScheduler() ?? AsyncScheduler.Default;\nvar buffer = source.Buffer(TimeSpan.FromSeconds(1), sched);","handlingStrategy":"validation","validationCode":"if (scheduler is null) scheduler = AsyncScheduler.Default;\nvar buffered = source.Buffer(timeSpan, scheduler);","typeGuard":"static bool HasScheduler(IAsyncScheduler s) => s is not null;","tryCatchPattern":"try { var b = source.Buffer(timeSpan, scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { scheduler = AsyncScheduler.Default; var b = source.Buffer(timeSpan, scheduler); }","preventionTips":["Use AsyncScheduler.Default as the fallback whenever no scheduler is intentionally provided.","Verify DI registrations for IAsyncScheduler with a startup assertion.","Never pass scheduler parameters straight from nullable fields; null-coalesce them.","In tests, supply a TestScheduler explicitly rather than relying on defaults."],"tags":["argument-validation","null-reference","scheduler","asyncrx"],"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"}