{"record":{"id":"7ce0d11eea789253","repo":"dotnet/reactive","slug":"scheduler-replay","errorCode":null,"errorMessage":"scheduler","messagePattern":"scheduler","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Replay.cs","lineNumber":146,"sourceCode":"                throw new ArgumentNullException(nameof(source));\n            if (selector == null)\n                throw new ArgumentNullException(nameof(selector));\n            if (bufferSize < 0)\n                throw new ArgumentOutOfRangeException(nameof(bufferSize));\n\n            return Multicast(source, () => new SequentialReplayAsyncSubject<TSource>(bufferSize), selector);\n        }\n\n        public static IAsyncObservable<TResult> Replay<TSource, TResult>(this IAsyncObservable<TSource> source, Func<IAsyncObservable<TSource>, IAsyncObservable<TResult>> selector, int bufferSize, IAsyncScheduler scheduler)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (selector == null)\n                throw new ArgumentNullException(nameof(selector));\n            if (bufferSize < 0)\n                throw new ArgumentOutOfRangeException(nameof(bufferSize));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return Multicast(source, () => new SequentialReplayAsyncSubject<TSource>(bufferSize, scheduler), selector);\n        }\n\n        public static IAsyncObservable<TResult> Replay<TSource, TResult>(this IAsyncObservable<TSource> source, Func<IAsyncObservable<TSource>, IAsyncObservable<TResult>> selector, TimeSpan window)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (selector == null)\n                throw new ArgumentNullException(nameof(selector));\n            if (window < TimeSpan.Zero)\n                throw new ArgumentOutOfRangeException(nameof(window));\n\n            return Multicast(source, () => new SequentialReplayAsyncSubject<TSource>(window), selector);\n        }\n\n        public static IAsyncObservable<TResult> Replay<TSource, TResult>(this IAsyncObservable<TSource> source, Func<IAsyncObservable<TSource>, IAsyncObservable<TResult>> selector, TimeSpan window, IAsyncScheduler scheduler)\n        {","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Replay.cs#L128-L164","documentation":"The Replay(source, selector, bufferSize, scheduler) overload throws ArgumentNullException because the IAsyncScheduler passed was null. The scheduler drives the sequential replay subject's timing, so a null scheduler would break replay behavior. Validation happens eagerly when Replay is called.","triggerScenarios":"Calling source.Replay(selector, bufferSize, null), or passing a scheduler property/field that was never initialized (e.g. a null injected dependency).","commonSituations":"Dependency-injected scheduler not registered in the container; static scheduler field not yet assigned; test code omitting the scheduler argument by passing null intentionally.","solutions":["Pass a concrete scheduler such as Scheduler.Default.Async or your configured IAsyncScheduler instance.","Check why the scheduler variable is null (DI registration, initialization order) and fix it.","Fall back to a default scheduler when none is configured: scheduler ?? Scheduler.Default.Async."],"exampleFix":"// before\nvar replayed = source.Replay(selector, 10, scheduler); // scheduler == null\n// after\nvar replayed = source.Replay(selector, 10, scheduler ?? Scheduler.Default.Async);","handlingStrategy":"validation","validationCode":"if (scheduler is null) throw new InvalidOperationException(\"scheduler must be provided\");\n// safe to call source.Replay(selector, bufferSize, scheduler);","typeGuard":"bool HasScheduler(IAsyncScheduler s) => s is not null;","tryCatchPattern":"try { var r = source.Replay(selector, bufferSize, scheduler); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { /* fall back to Scheduler.Default.Async */ }","preventionTips":["Default scheduler parameters with '?? Scheduler.Default.Async'.","Assert DI registration of IAsyncScheduler at startup.","In tests, always pass an explicit test scheduler."],"tags":["argument-null","scheduler","replay"],"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"}