{"record":{"id":"b900ff455b9aeeaa","repo":"dotnet/reactive","slug":"throw-new-argumentnullexception-nameof-selector","errorCode":null,"errorMessage":"throw new ArgumentNullException(nameof(selector));","messagePattern":"throw new ArgumentNullException\\(nameof\\(selector\\)\\);","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Replay.cs","lineNumber":286,"sourceCode":"        {\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            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return Multicast(source, () => new ValueTask<IAsyncSubject<TSource, TSource>>(new SequentialReplayAsyncSubject<TSource>(window, scheduler)), 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)\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\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));","sourceCodeStart":268,"sourceCodeEnd":304,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Replay.cs#L268-L304","documentation":"The Replay(source, selector, bufferSize, window) overload throws ArgumentNullException when the selector function is null. The selector consumes the replay subject to produce the result observable and is validated eagerly. This check runs after the source null check and before bufferSize/window range checks.","triggerScenarios":"Calling source.Replay(null, bufferSize, window) or passing a delegate variable that was never assigned.","commonSituations":"Selectors built conditionally where one branch leaves the variable null; refactoring that removed the lambda; overload confusion omitting the selector argument position.","solutions":["Pass a non-null async selector lambda for the replay subject.","Fix the code path that assigns the selector delegate.","Confirm argument order: source, selector, bufferSize, window."],"exampleFix":"// before\nFunc<IAsyncObservable<int>, ValueTask<IAsyncObservable<int>>> selector = null;\nvar result = source.Replay(selector, 10, TimeSpan.FromSeconds(5));\n// after\nselector = async s => await s.SelectAsync(x => x);\nvar result = source.Replay(selector, 10, TimeSpan.FromSeconds(5));","handlingStrategy":"validation","validationCode":"if (selector == null) throw new InvalidOperationException(\"selector delegate required\");","typeGuard":"bool IsValidSelector<TSource, TResult>(Func<IAsyncObservable<TSource>, ValueTask<IAsyncObservable<TResult>>> f) => f != null;","tryCatchPattern":"try { var r = source.Replay(sel, bufferSize, window); } catch (ArgumentNullException ex) when (ex.ParamName == \"selector\") { /* supply default selector */ }","preventionTips":["Pass selector lambdas inline","Confirm argument order (source, selector, bufferSize, window) when switching overloads","Initialize delegate variables where declared"],"tags":["argument-null","selector","async-rx","replay-operator"],"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"}