{"record":{"id":"8bcf7ad43be405c4","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-observer-generate","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'observer')","messagePattern":"Value cannot be null\\. \\(Parameter 'observer'\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs","lineNumber":190,"sourceCode":"            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 Create<TResult>(observer => AsyncObserver.Generate(observer, initialState, condition, iterate, resultSelector, timeSelector, scheduler));\n        }\n    }\n\n    public partial class AsyncObserver\n    {\n        public static ValueTask<IAsyncDisposable> Generate<TState, TResult>(IAsyncObserver<TResult> observer, TState initialState, Func<TState, bool> condition, Func<TState, TState> iterate, Func<TState, TResult> resultSelector)\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\n            return Generate(observer, initialState, s => new ValueTask<bool>(condition(s)), s => new ValueTask<TState>(iterate(s)), s => new ValueTask<TResult>(resultSelector(s)), TaskPoolAsyncScheduler.Default);\n        }\n\n        public static ValueTask<IAsyncDisposable> Generate<TState, TResult>(IAsyncObserver<TResult> observer, TState initialState, Func<TState, bool> condition, Func<TState, TState> iterate, Func<TState, TResult> resultSelector, 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));","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs#L172-L208","documentation":"On the AsyncObserver side, the three-delegate Generate convenience method (observer, initialState, condition, iterate, resultSelector) first validates the target IAsyncObserver. When observer is null, the guard at AsyncRx.NET/System.Reactive.Async/Linq/Operators/Generate.cs:190 throws ArgumentNullException('observer'). An observer is required because Generate exists only to push generated values somewhere; there is no valid subscription without one.","triggerScenarios":"Calling AsyncObserver.Generate<TState,TResult>(null, initialState, condition, iterate, resultSelector), usually from custom operator plumbing where the downstream observer variable was never assigned or a subscription factory returned null.","commonSituations":"Writing a custom IAsyncObservable whose Subscribe implementation passes through an observer obtained from Create(...) plumbing that can be null; composing operators where an earlier stage returned null instead of throwing; unit tests constructing observers lazily.","solutions":["Ensure the IAsyncObserver passed in is non-null before calling AsyncObserver.Generate.","In custom Subscribe implementations, throw ArgumentNullException(nameof(observer)) yourself at the entry point.","Trace where the observer comes from (e.g. AsyncObservable.Create) and fix the stage producing null."],"exampleFix":"// before\nawait AsyncObserver.Generate(observer, 0, c, i, s);\n// after\nif (observer == null) throw new ArgumentNullException(nameof(observer));\nawait AsyncObserver.Generate(observer, 0, c, i, s);","handlingStrategy":"validation","validationCode":"if (observer is null) throw new ArgumentNullException(nameof(observer));\nawait AsyncObserver.Generate(observer, 0, cond, step, sel);","typeGuard":"static bool HasObserver<TResult>(IAsyncObserver<TResult> o) => o is not null;","tryCatchPattern":"try { await AsyncObserver.Generate(observer, 0, cond, step, sel); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"observer\") { /* fix the pipeline stage producing a null observer */ }","preventionTips":["Throw ArgumentNullException at your Subscribe boundary before delegation.","Ensure AsyncObservable.Create callbacks always return a real observer.","Avoid storing observers in nullable fields that may be read before assignment."],"tags":["argument-null","asyncrx","observer","generate-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"}