{"record":{"id":"96bfe4362e2ae6d0","repo":"dotnet/reactive","slug":"throw-new-argumentnullexception-nameof-scheduler","errorCode":null,"errorMessage":"throw new ArgumentNullException(nameof(scheduler));","messagePattern":"throw new ArgumentNullException\\(nameof\\(scheduler\\)\\);","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Replay.cs","lineNumber":306,"sourceCode":"                throw new ArgumentOutOfRangeException(nameof(bufferSize));\n            if (window < TimeSpan.Zero)\n                throw new ArgumentOutOfRangeException(nameof(window));\n\n            return Multicast(source, () => new ValueTask<IAsyncSubject<TSource, TSource>>(new SequentialReplayAsyncSubject<TSource>(bufferSize, window)), selector);\n        }\n\n        public static IAsyncObservable<TResult> Replay<TSource, TResult>(this IAsyncObservable<TSource> source, Func<IAsyncObservable<TSource>, ValueTask<IAsyncObservable<TResult>>> selector, int bufferSize, TimeSpan window, 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 (window < TimeSpan.Zero)\n                throw new ArgumentOutOfRangeException(nameof(window));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return Multicast(source, () => new ValueTask<IAsyncSubject<TSource, TSource>>(new SequentialReplayAsyncSubject<TSource>(bufferSize, window, scheduler)), selector);\n        }\n    }\n}\n","sourceCodeStart":288,"sourceCodeEnd":312,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Replay.cs#L288-L312","documentation":"The scheduler-based Replay overload (source, selector, bufferSize, window, scheduler) validates the scheduler last and throws ArgumentNullException when it is null. The scheduler is required in this overload because it drives timing of buffered-item expiry, so passing null fails fast.","triggerScenarios":"Calling AsyncObservable.Replay(source, selector, bufferSize, window, null), typically when a scheduler dependency resolved to null or when intending the default scheduler overload and forgetting it needs an explicit instance.","commonSituations":"DI container missing an IAsyncScheduler registration; a scheduler field assigned asynchronously after pipeline construction; calling the 5-argument overload while intending the 4-argument default-scheduler overload.","solutions":["Pass an explicit scheduler instance (e.g. AsyncScheduler.Default) or drop the scheduler argument to use the overload with default timing.","Ensure the IAsyncScheduler is registered and resolvable from your DI container before building the pipeline.","Guard with scheduler ?? AsyncScheduler.Default if null is legitimate in your configuration layer."],"exampleFix":"// before\nvar replayed = AsyncObservable.Replay(source, sel, 10, window, scheduler: null);\n// after\nvar replayed = AsyncObservable.Replay(source, sel, 10, window, scheduler: AsyncScheduler.Default);","handlingStrategy":"validation","validationCode":"if (scheduler is null) throw new InvalidOperationException(\"Replay with a window requires a non-null scheduler\");","typeGuard":"static bool IsValidScheduler(IAsyncScheduler scheduler) => scheduler is not null;","tryCatchPattern":"try { var replayed = AsyncObservable.Replay(source, sel, 10, window, scheduler); } catch (ArgumentNullException ex) when (ex.ParamName == \"scheduler\") { /* pass AsyncScheduler.Default */ }","preventionTips":["Register IAsyncScheduler in your DI container.","Use AsyncScheduler.Default explicitly when no custom scheduler is needed.","Drop the scheduler argument to use the default-timing overload."],"tags":["null-argument","scheduler","reactive-extensions"],"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"}