{"record":{"id":"9ea0052cbc54c32c","repo":"dotnet/reactive","slug":"argumentnullexception-elementselector","errorCode":null,"errorMessage":"ArgumentNullException: elementSelector","messagePattern":"ArgumentNullException: elementSelector","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/GroupBy.cs","lineNumber":81,"sourceCode":"            if (capacity < 0)\n                throw new ArgumentOutOfRangeException(nameof(capacity));\n            if (comparer == null)\n                throw new ArgumentNullException(nameof(comparer));\n\n            return CreateAsyncObservable<IGroupedAsyncObservable<TKey, TSource>>.From(\n                source,\n                (keySelector, capacity, comparer),\n                static (source, state, observer) => GroupByCore(source, observer, (o, d) => AsyncObserver.GroupBy(o, d, state.keySelector, state.capacity, state.comparer)));\n        }\n\n        public static IAsyncObservable<IGroupedAsyncObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IAsyncObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (keySelector == null)\n                throw new ArgumentNullException(nameof(keySelector));\n            if (elementSelector == null)\n                throw new ArgumentNullException(nameof(elementSelector));\n\n            return CreateAsyncObservable<IGroupedAsyncObservable<TKey, TElement>>.From(\n                source,\n                (keySelector, elementSelector),\n                static (source, state, observer) => GroupByCore(source, observer, (o, d) => AsyncObserver.GroupBy(o, d, state.keySelector, state.elementSelector)));\n        }\n\n        public static IAsyncObservable<IGroupedAsyncObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IAsyncObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (keySelector == null)\n                throw new ArgumentNullException(nameof(keySelector));\n            if (elementSelector == null)\n                throw new ArgumentNullException(nameof(elementSelector));\n            if (comparer == null)\n                throw new ArgumentNullException(nameof(comparer));\n","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/GroupBy.cs#L63-L99","documentation":"The GroupBy(source, keySelector, elementSelector) overload throws ArgumentNullException when elementSelector is null. The element selector projects each item into the group's element type and is mandatory in this overload. The check is performed synchronously before any subscription happens.","triggerScenarios":"Calling the three-argument GroupBy overload with null as elementSelector, e.g. GroupBy(source, x => x.Key, null); use the two-argument overload if no element projection is needed.","commonSituations":"Devs upgrading from the two-argument overload who forget to supply the projection; conditional projection logic that leaves the Func null; generic helper methods forwarding a null selector parameter.","solutions":["Supply a non-null element projection such as x => x to keep elements unchanged","Switch to the GroupBy(source, keySelector) overload when no projection is needed","Default null selectors to x => x in wrapper code"],"exampleFix":"// before\nvar grouped = source.GroupBy(x => x.Key, null);\n// after\nvar grouped = source.GroupBy(x => x.Key, x => x);","handlingStrategy":"validation","validationCode":"if (elementSelector == null) throw new ArgumentNullException(nameof(elementSelector));","typeGuard":"bool IsValidSelector<TSource,TElement>(Func<TSource,TElement> f) => f is not null;","tryCatchPattern":"try { var g = source.GroupBy(k, elementSelector); } catch (ArgumentNullException ex) when (ex.ParamName == \"elementSelector\") { /* fall back to identity projection */ }","preventionTips":["Remember: adding extra arguments (comparer/capacity) requires the elementSelector too","Use x => x explicitly when no projection is needed instead of null","Wrap operator calls in helpers that default optional selectors"],"tags":["argument-null","element-selector","groupby","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"}