{"record":{"id":"c3529a97c7d4fb9c","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-predicate-lastordefault","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'predicate')","messagePattern":"Value cannot be null\\. \\(Parameter 'predicate'\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/LastOrDefault.cs","lineNumber":30,"sourceCode":"        public static IAsyncObservable<TSource> LastOrDefaultAsync<TSource>(this IAsyncObservable<TSource> source, Func<TSource, bool> predicate) => LastOrDefault(source, predicate);\n        public static IAsyncObservable<TSource> LastOrDefaultAsync<TSource>(this IAsyncObservable<TSource> source, Func<TSource, ValueTask<bool>> predicate) => LastOrDefault(source, predicate);\n\n        public static IAsyncObservable<TSource> LastOrDefault<TSource>(this IAsyncObservable<TSource> source)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n\n            return Create(\n                source,\n                (source, observer) => source.SubscribeSafeAsync(AsyncObserver.LastOrDefault(observer)));\n        }\n\n        public static IAsyncObservable<TSource> LastOrDefault<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 CreateAsyncObservable<TSource>.From(\n                source,\n                predicate,\n                static (source, predicate, observer) => source.SubscribeSafeAsync(AsyncObserver.LastOrDefault(observer, predicate)));\n        }\n\n        public static IAsyncObservable<TSource> LastOrDefault<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 CreateAsyncObservable<TSource>.From(\n                source,\n                predicate,\n                static (source, predicate, observer) => source.SubscribeSafeAsync(AsyncObserver.LastOrDefault(observer, predicate)));","sourceCodeStart":12,"sourceCodeEnd":48,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/LastOrDefault.cs#L12-L48","documentation":"ArgumentNullException thrown by the LastOrDefault(source, Func<TSource,bool> predicate) overload when the predicate delegate is null. The library validates both parameters synchronously before building the operator pipeline, so the throw occurs at the call site, not during subscription.","triggerScenarios":"Calling LastOrDefault(source, null) — e.g. a predicate variable that was never assigned, or a conditional-filter API that passed its own null filter argument through.","commonSituations":"Passing an optional filter delegate that defaulted to null, reflection-based delegate construction that failed silently, or refactoring that removed the lambda but left the call.","solutions":["Pass a non-null predicate delegate to LastOrDefault","If filtering is optional, branch: omit the predicate overload entirely when the filter is null","Provide an always-true predicate (e.g. _ => true) when you want no filtering","Fix the caller that forwarded a null filter"],"exampleFix":"// before\nvar last = source.LastOrDefault(filter);\n// after\nvar last = filter != null ? source.LastOrDefault(filter) : source.LastOrDefault();","handlingStrategy":"validation","validationCode":"if (predicate is null) throw new ArgumentNullException(nameof(predicate));\n// or skip filtering when null:\nvar result = filter != null ? source.LastOrDefault(filter) : source.LastOrDefault();","typeGuard":"static bool IsValidPredicate<T>(Func<T, bool> p) => p is not null;","tryCatchPattern":"try\n{\n    var last = await source.LastOrDefaultAsync(pred);\n}\ncatch (ArgumentNullException ex) when (ex.ParamName == \"predicate\")\n{\n    // fall back to unfiltered query or default\n}","preventionTips":["Default optional filters to an always-true lambda instead of null","Use nullable-reference-type annotations on delegate parameters","Check argument order when passing delegates positionally"],"tags":["argumentnull","null-predicate","linq-operator","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"}