{"record":{"id":"2ff10f2f45ac91b9","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-selector-selectmany","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'selector')","messagePattern":"Value cannot be null\\. \\(Parameter 'selector'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/SelectMany.cs","lineNumber":189,"sourceCode":"                static async (source, state, observer) =>\n                {\n                    var (sink, inner) = AsyncObserver.SelectMany(observer, state.collectionSelector, state.resultSelector);\n\n                    var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(subscription, inner);\n                });\n        }\n    }\n\n    public partial class AsyncObserver\n    {\n        public static (IAsyncObserver<TSource>, IAsyncDisposable) SelectMany<TSource, TResult>(IAsyncObserver<TResult> observer, Func<TSource, IAsyncObservable<TResult>> selector)\n        {\n            if (observer == null)\n                throw new ArgumentNullException(nameof(observer));\n            if (selector == null)\n                throw new ArgumentNullException(nameof(selector));\n\n            return SelectMany<TSource, TResult, TResult>(observer, x => new ValueTask<IAsyncObservable<TResult>>(selector(x)), (x, y) => new ValueTask<TResult>(y));\n        }\n\n        public static (IAsyncObserver<TSource>, IAsyncDisposable) SelectMany<TSource, TResult>(IAsyncObserver<TResult> observer, Func<TSource, ValueTask<IAsyncObservable<TResult>>> selector)\n        {\n            if (observer == null)\n                throw new ArgumentNullException(nameof(observer));\n            if (selector == null)\n                throw new ArgumentNullException(nameof(selector));\n\n            return SelectMany<TSource, TResult, TResult>(observer, selector, (x, y) => new ValueTask<TResult>(y));\n        }\n\n        public static (IAsyncObserver<TSource>, IAsyncDisposable) SelectMany<TSource, TCollection, TResult>(IAsyncObserver<TResult> observer, Func<TSource, IAsyncObservable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)\n        {\n            if (observer == null)\n                throw new ArgumentNullException(nameof(observer));","sourceCodeStart":171,"sourceCodeEnd":207,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/SelectMany.cs#L171-L207","documentation":"The AsyncObserver.SelectMany overload (observer, Func<TSource, IAsyncObservable<TResult>> selector) throws ArgumentNullException because the selector parameter was null. The selector maps each source element to an inner async observable; a null selector leaves the operator unable to project elements, so it is rejected at construction time.","triggerScenarios":"Calling AsyncObserver.SelectMany(observer, null) with the sync-observable-selector overload, or passing a selector field/property that is still null (e.g. uninitialized delegate member).","commonSituations":"DI or configuration supplying the projection function lazily and failing, casting a method group from an object whose method is null, or refactoring where the selector argument was accidentally deleted.","solutions":["Provide a real selector, e.g. x => AsyncObservable.Return(x * 2) or a method group like Project.","If the selector may be absent, fall back to an identity-based projection such as x => AsyncObservable.Empty<TResult>() rather than null.","Initialize delegate-typed members/fields with a default projection.","Validate at the call site before constructing the operator."],"exampleFix":"// before\nvar (obs, disp) = AsyncObserver.SelectMany<TSource, TResult>(downstream, null);\n\n// after\nFunc<TSource, IAsyncObservable<TResult>> selector = ProjectElement;\nvar (obs, disp) = AsyncObserver.SelectMany(downstream, selector);","handlingStrategy":"validation","validationCode":"if (observer is null) throw new ArgumentNullException(nameof(observer));\nif (selector is null) throw new ArgumentNullException(nameof(selector));","typeGuard":"static bool IsValid<TSource, TResult>(\n    IAsyncObserver<TResult> observer,\n    Func<TSource, IAsyncObservable<TResult>> selector)\n    => observer is not null && selector is not null;","tryCatchPattern":"try\n{\n    var (obs, disp) = AsyncObserver.SelectMany(observer, selector);\n}\ncatch (ArgumentNullException ex) when (ex.ParamName == \"selector\")\n{\n    selector = x => AsyncObservable.Empty<TResult>();\n}","preventionTips":["Initialize delegate-typed members with a default projection instead of null.","Resolve selectors from configuration with a fallback identity/default projection.","Keep argument order matched to the overload signature when editing call sites."],"tags":["argument-null","asyncrx","observer","selectmany"],"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"}