{"record":{"id":"cce0c3edd66788ea","repo":"dotnet/reactive","slug":"argument-cannot-be-null-parameter-name-predicate-cce0c3","errorCode":null,"errorMessage":"Argument cannot be null (Parameter name: predicate)","messagePattern":"Argument cannot be null \\(Parameter name: predicate\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/FirstOrDefault.cs","lineNumber":28,"sourceCode":"    {\n        public static IAsyncObservable<TSource> FirstOrDefaultAsync<TSource>(this IAsyncObservable<TSource> source) => FirstOrDefault(source);\n        public static IAsyncObservable<TSource> FirstOrDefaultAsync<TSource>(this IAsyncObservable<TSource> source, Func<TSource, bool> predicate) => FirstOrDefault(source, predicate);\n        public static IAsyncObservable<TSource> FirstOrDefaultAsync<TSource>(this IAsyncObservable<TSource> source, Func<TSource, ValueTask<bool>> predicate) => FirstOrDefault(source, predicate);\n\n        public static IAsyncObservable<TSource> FirstOrDefault<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.FirstOrDefault(observer)));\n        }\n\n        public static IAsyncObservable<TSource> FirstOrDefault<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.FirstOrDefault(observer, predicate)));\n        }\n\n        public static IAsyncObservable<TSource> FirstOrDefault<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.FirstOrDefault(observer, predicate)));","sourceCodeStart":10,"sourceCodeEnd":46,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/FirstOrDefault.cs#L10-L46","documentation":"FirstOrDefault<TSource>(source, Func<TSource,bool>) (FirstOrDefault.cs:28) throws ArgumentNullException when the predicate delegate is null. The overload requires a filter; passing null would break AsyncObserver.FirstOrDefault(observer, predicate) at first emission, so validation happens eagerly at composition time with the parameter named in the message.","triggerScenarios":"Calling FirstOrDefaultAsync(source, (Func<TSource,bool>)null) — e.g. a conditionally built filter delegate, a nullable Func field, or reflection-based invocation supplying null for the predicate slot.","commonSituations":"UI-driven filter construction where the user hasn't chosen a predicate yet; generic query-builder code that appends filters optionally but always calls the filtered overload; migrating from LINQ's Where-style APIs that sometimes tolerate null (they don't here either).","solutions":["Always pass a concrete predicate; for 'match everything' use x => true.","Use the no-predicate overload FirstOrDefaultAsync(source) when no filtering is wanted.","Coalesce: source.FirstOrDefaultAsync(predicate ?? (_ => true)) only when bypass is intentional."],"exampleFix":"// before\nExpression<Func<int,bool>> pred = hasFilter ? x => x > min : null;\nvar first = src.FirstOrDefaultAsync(pred?.Compile());\n\n// after\nvar first = hasFilter ? src.FirstOrDefaultAsync(x => x > min) : src.FirstOrDefaultAsync();","handlingStrategy":"validation","validationCode":"if (predicate is null) throw new ArgumentNullException(nameof(predicate));\nvar first = source.FirstOrDefaultAsync(predicate);","typeGuard":"static bool HasPredicate<T>(Func<T, bool>? p) => p is not null;","tryCatchPattern":"try { var first = src.FirstOrDefaultAsync(pred); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"predicate\") { /* use unfiltered overload */ }","preventionTips":["Use FirstOrDefaultAsync(source) when no filter is needed","Coalesce optional filters with _ => true only deliberately","Build predicates in one non-nullable expression"],"tags":["argumentnull","predicate","asyncrx","firstordefault"],"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"}