{"record":{"id":"66735f729a495ab4","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-onnext","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'onNext')","messagePattern":"Value cannot be null\\. \\(Parameter 'onNext'\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/AsyncObservableExtensions.cs","lineNumber":65,"sourceCode":"        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (onNextAsync == null)\n                throw new ArgumentNullException(nameof(onNextAsync));\n            if (onErrorAsync == null)\n                throw new ArgumentNullException(nameof(onErrorAsync));\n            if (onCompletedAsync == null)\n                throw new ArgumentNullException(nameof(onCompletedAsync));\n\n            return source.SubscribeAsync(new AsyncObserver<T>(onNextAsync, onErrorAsync, onCompletedAsync));\n        }\n\n        public static ValueTask<IAsyncDisposable> SubscribeAsync<T>(this IAsyncObservable<T> source, Action<T> onNext)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (onNext == null)\n                throw new ArgumentNullException(nameof(onNext));\n\n            return source.SubscribeAsync(new AsyncObserver<T>(x => { onNext(x); return default; }, ex => new ValueTask(Task.FromException(ex)), () => default));\n        }\n\n        public static ValueTask<IAsyncDisposable> SubscribeAsync<T>(this IAsyncObservable<T> source, Action<T> onNext, Action<Exception> onError)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (onNext == null)\n                throw new ArgumentNullException(nameof(onNext));\n            if (onError == null)\n                throw new ArgumentNullException(nameof(onError));\n\n            return source.SubscribeAsync(new AsyncObserver<T>(x => { onNext(x); return default; }, ex => { onError(ex); return default; }, () => default));\n        }\n\n        public static ValueTask<IAsyncDisposable> SubscribeAsync<T>(this IAsyncObservable<T> source, Action<T> onNext, Action onCompleted)\n        {","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/AsyncObservableExtensions.cs#L47-L83","documentation":"Thrown by the action-based SubscribeAsync(source, onNext) overload when the onNext action is null. onNext is the mandatory element handler; the library fails fast with ArgumentNullException rather than throwing when the first element arrives.","triggerScenarios":"Calling SubscribeAsync(source, (Action<T>)null) or passing a conditionally assigned Action<T> that is null.","commonSituations":"Event-handler fields not yet assigned, or lambda variables cleared during teardown that are still used for a re-subscription.","solutions":["Provide a non-null onNext action, even an empty one: x => { }.","Use a different subscription style (e.g. full AsyncObserver) if handlers are dynamic.","Assert/validate handler fields before subscribing."],"exampleFix":"// before\nAction<int> handler = _handlers.GetValueOrDefault(\"onNext\"); // may be null\nawait source.SubscribeAsync(handler);\n// after\nawait source.SubscribeAsync(_handlers.TryGetValue(\"onNext\", out var h) ? h : x => { });","handlingStrategy":"validation","validationCode":"if (onNext == null) throw new ArgumentNullException(nameof(onNext));\nawait source.SubscribeAsync(onNext);","typeGuard":"bool HasNextHandler<T>(Action<T> onNext) => onNext is not null;","tryCatchPattern":"try\n{\n    await source.SubscribeAsync(onNext);\n}\ncatch (ArgumentNullException ex) when (ex.ParamName == \"onNext\")\n{\n    logger.LogError(\"onNext handler was null\");\n}","preventionTips":["Always pass a concrete onNext action; use x => { } for a no-op.","Do not store handlers in nullable fields consumed later; assign at construction.","Default missing handler-table entries to a no-op lambda.","Enable nullable reference types to catch unassigned Action fields."],"tags":["csharp","null-argument","asyncrx","argument-validation"],"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"}