{"record":{"id":"2d5c413de1a3e13b","repo":"dotnet/reactive","slug":"new-argumentnullexception-nameof-resultselector","errorCode":null,"errorMessage":"new ArgumentNullException(nameof(resultSelector))","messagePattern":"new ArgumentNullException\\(nameof\\(resultSelector\\)\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs","lineNumber":354,"sourceCode":"                throw new ArgumentNullException(nameof(iterate));\n            if (resultSelector == null)\n                throw new ArgumentNullException(nameof(resultSelector));\n            if (timeSelector == null)\n                throw new ArgumentNullException(nameof(timeSelector));\n\n            return Generate(observer, initialState, condition, iterate, resultSelector, timeSelector, TaskPoolAsyncScheduler.Default);\n        }\n\n        public static ValueTask<IAsyncDisposable> Generate<TState, TResult>(IAsyncObserver<TResult> observer, TState initialState, Func<TState, ValueTask<bool>> condition, Func<TState, ValueTask<TState>> iterate, Func<TState, ValueTask<TResult>> resultSelector, Func<TState, ValueTask<TimeSpan>> timeSelector, IAsyncScheduler scheduler)\n        {\n            if (observer == null)\n                throw new ArgumentNullException(nameof(observer));\n            if (condition == null)\n                throw new ArgumentNullException(nameof(condition));\n            if (iterate == null)\n                throw new ArgumentNullException(nameof(iterate));\n            if (resultSelector == null)\n                throw new ArgumentNullException(nameof(resultSelector));\n            if (timeSelector == null)\n                throw new ArgumentNullException(nameof(timeSelector));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return scheduler.ScheduleAsync(async ct =>\n            {\n                var first = true;\n                var state = initialState;\n\n                while (!ct.IsCancellationRequested)\n                {\n                    var hasResult = false;\n                    var result = default(TResult);\n                    var nextDue = default(TimeSpan);\n\n                    try\n                    {","sourceCodeStart":336,"sourceCodeEnd":372,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs#L336-L372","documentation":"The fully-async Generate overload throws ArgumentNullException when the resultSelector delegate is null. resultSelector maps each state to the emitted TResult; without it the operator cannot produce output, so the null check runs before the work is scheduled on the IAsyncScheduler.","triggerScenarios":"Calling Generate(observer, initialState, condition, iterate, resultSelector, timeSelector, scheduler) with ValueTask delegates (Generate.cs:345) and passing null for Func<TState, ValueTask<TResult>> resultSelector.","commonSituations":"Wiring selectors from a mapping table or DI container where the entry for resultSelector is missing; copy-pasting an overload call and forgetting to supply the result selector; conditional delegate assignment that evaluates to null.","solutions":["Provide a real resultSelector, e.g. s => new ValueTask<TResult>(Project(s)).","If projection is trivial, pass an identity-style lambda such as s => new ValueTask<TState>(s) when TState == TResult.","Assert/validate the delegate at composition time with ArgumentNullException.ThrowIfNull(resultSelector) in your own factory before delegating to Generate."],"exampleFix":"// before\nGenerate(observer, 0, cond, iter, null, timeSel, sched); // throws\n// after\nGenerate(observer, 0, cond, iter, s => new ValueTask<string>(\"v\" + s), timeSel, sched);","handlingStrategy":"validation","validationCode":"if (resultSelector == null) throw new ArgumentNullException(nameof(resultSelector));","typeGuard":"static bool HasSelector<TState, TResult>(Func<TState, ValueTask<TResult>> sel) => sel is not null;","tryCatchPattern":"try { await Generate(observer, state, cond, iter, sel, timeSel, sched); } catch (ArgumentNullException ex) when (ex.ParamName == \"resultSelector\") { /* supply fallback selector */ }","preventionTips":["Check DI/config maps for every delegate argument before composing the query.","Prefer method groups over nullable lambda variables.","Add unit tests that exercise each Generate overload with real delegates."],"tags":["argument-null","generate","async-rx"],"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"}