{"record":{"id":"705e83d51d2f0ce2","repo":"dotnet/reactive","slug":"nameof-predicate","errorCode":null,"errorMessage":"nameof(predicate)","messagePattern":"nameof\\(predicate\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/First.cs","lineNumber":28,"sourceCode":"    {\n        public static IAsyncObservable<TSource> FirstAsync<TSource>(this IAsyncObservable<TSource> source) => First(source);\n        public static IAsyncObservable<TSource> FirstAsync<TSource>(this IAsyncObservable<TSource> source, Func<TSource, bool> predicate) => First(source, predicate);\n        public static IAsyncObservable<TSource> FirstAsync<TSource>(this IAsyncObservable<TSource> source, Func<TSource, ValueTask<bool>> predicate) => First(source, predicate);\n\n        public static IAsyncObservable<TSource> First<TSource>(this IAsyncObservable<TSource> source)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n\n            return Create(source, static (source, observer) => source.SubscribeSafeAsync(AsyncObserver.First(observer)));\n        }\n\n        public static IAsyncObservable<TSource> First<TSource>(this IAsyncObservable<TSource> source, Func<TSource, bool> predicate)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (predicate == null)\n                throw new ArgumentNullException(nameof(predicate));\n\n            return Create(\n                source,\n                predicate,\n                static (source, predicate, observer) => source.SubscribeSafeAsync(AsyncObserver.First(observer, predicate)));\n        }\n\n        public static IAsyncObservable<TSource> First<TSource>(this IAsyncObservable<TSource> source, Func<TSource, ValueTask<bool>> predicate)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (predicate == null)\n                throw new ArgumentNullException(nameof(predicate));\n\n            return Create(\n                source,\n                predicate,\n                static (source, predicate, observer) => source.SubscribeSafeAsync(AsyncObserver.First(observer, predicate)));","sourceCodeStart":10,"sourceCodeEnd":46,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/First.cs#L10-L46","documentation":"ArgumentNullException thrown by First(source, Func<TSource,bool> predicate) when the predicate delegate itself is null. First uses the predicate to filter elements while searching for the first match, and a null filter is invalid. The parameter name reported is 'predicate'.","triggerScenarios":"Calling source.First(null) or FirstAsync(source, (Func<TSource,bool>)null); predicate stored in a nullable delegate field/property that was never assigned, or built dynamically (expression-to-delegate compilation) and left null.","commonSituations":"Configurable filtering (UI-selected filters, rule engines) where no filter yields a null delegate; overloads resolved via reflection passing a null argument.","solutions":["Ensure a predicate is supplied; treat 'no filter' with the predicateless First() overload instead of passing null","Coalesce to an always-true predicate: source.First(x => true) or source.FirstAsync(_ => true)","Fix the code that constructs/assigns the predicate so it never yields null"],"exampleFix":"// before\nvar item = await source.FirstAsync(filter); // filter is null\n// after\nvar item = await (filter != null ? source.FirstAsync(filter) : source.FirstAsync());","handlingStrategy":"validation","validationCode":"if (source == null) throw new ArgumentNullException(nameof(source));\nvar item = predicate != null\n    ? await source.FirstAsync(predicate)\n    : await source.FirstAsync();","typeGuard":"bool HasFilter<T>(Func<T,bool>? p) => p is not null;","tryCatchPattern":"try\n{\n    var item = await source.FirstAsync(predicate);\n}\ncatch (ArgumentNullException ex) when (ex.ParamName == nameof(predicate))\n{\n    var item = await source.FirstAsync(); // no filter requested\n}","preventionTips":["Model 'no filter' with the predicateless overload, never a null predicate","Default configurable filters to _ => true","Ensure dynamic filter builders throw or return a valid predicate, never null"],"tags":["csharp","null-argument","argument-validation","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"}