{"record":{"id":"412376c901c992c6","repo":"dotnet/reactive","slug":"new-argumentnullexception-nameof-iterate","errorCode":null,"errorMessage":"new ArgumentNullException(nameof(iterate))","messagePattern":"new ArgumentNullException\\(nameof\\(iterate\\)\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs","lineNumber":352,"sourceCode":"                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\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","sourceCodeStart":334,"sourceCodeEnd":370,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs#L334-L370","documentation":"AsyncReactive's Generate operator throws ArgumentNullException when the iterate (state-advance) delegate is null. Generate requires every per-iteration callback (condition, iterate, resultSelector, timeSelector) to advance/emit values; a null iterate would make the state machine unable to progress past the first element, so it is rejected eagerly before scheduling.","triggerScenarios":"Calling the fully-async overload AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs:345 (Generate(observer, initialState, condition, iterate, resultSelector, timeSelector, scheduler) with ValueTask-returning delegates) passing null for the Func<TState, ValueTask<TState>> iterate parameter, typically via a ternary or variable that resolves to null.","commonSituations":"Building a timed generator where the iterate lambda is conditionally assigned; passing a method group whose target is null; refactoring from Rx's Generate where iterate was optional or inferred and porting to System.Reactive.Async where it is mandatory.","solutions":["Pass a non-null iterate delegate, e.g. s => new ValueTask<TState>(s + 1) or an equivalent method group.","If iterate is optional in your design, supply an identity function s => new ValueTask<TState>(s) instead of null.","Check the expression producing the delegate (ternary, config-driven lookup) and guard it before calling Generate."],"exampleFix":"// before\nFunc<int, ValueTask<int>> iterate = maybeStep; // null\nawait AsyncObservable.Generate(observer, 0, s => new ValueTask<bool>(s < 10), iterate, ...);\n// after\nvar iterate = maybeStep ?? (s => new ValueTask<int>(s + 1));\nawait AsyncObservable.Generate(observer, 0, s => new ValueTask<bool>(s < 10), iterate, ...);","handlingStrategy":"validation","validationCode":"if (iterate == null) throw new ArgumentNullException(nameof(iterate));","typeGuard":"static bool IsValidGenerateArgs<TState, TResult>(Func<TState, ValueTask<bool>> cond, Func<TState, ValueTask<TState>> iter, Func<TState, ValueTask<TResult>> sel, Func<TState, ValueTask<TimeSpan>> time, IAsyncScheduler sched) => cond != null && iter != null && sel != null && time != null && sched != null;","tryCatchPattern":"try { var d = await Generate(observer, 0, cond, iter, sel, timeSel, sched); } catch (ArgumentNullException ex) { /* ex.ParamName == \"iterate\" */ }","preventionTips":["Never pass nullable delegate variables into Generate; coalesce with ?? identity.","Wrap Generate in a project-local factory that validates all arguments once.","Enable nullable reference types (NonNullTypes) so null delegate flows are flagged at compile time."],"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"}