{"record":{"id":"7ec4a1ddcee03bc9","repo":"dotnet/reactive","slug":"predicate-singleordefault","errorCode":null,"errorMessage":"predicate","messagePattern":"predicate","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/SingleOrDefault.cs","lineNumber":28,"sourceCode":"    {\n        public static IAsyncObservable<TSource> SingleOrDefaultAsync<TSource>(this IAsyncObservable<TSource> source) => SingleOrDefault(source);\n        public static IAsyncObservable<TSource> SingleOrDefaultAsync<TSource>(this IAsyncObservable<TSource> source, Func<TSource, bool> predicate) => SingleOrDefault(source, predicate);\n        public static IAsyncObservable<TSource> SingleOrDefaultAsync<TSource>(this IAsyncObservable<TSource> source, Func<TSource, ValueTask<bool>> predicate) => SingleOrDefault(source, predicate);\n\n        public static IAsyncObservable<TSource> SingleOrDefault<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.SingleOrDefault(observer)));\n        }\n\n        public static IAsyncObservable<TSource> SingleOrDefault<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.SingleOrDefault(observer, predicate)));\n        }\n\n        public static IAsyncObservable<TSource> SingleOrDefault<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.SingleOrDefault(observer, predicate)));","sourceCodeStart":10,"sourceCodeEnd":46,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/SingleOrDefault.cs#L10-L46","documentation":"The predicate overload of SingleOrDefault throws ArgumentNullException when the Func<TSource,bool> predicate is null. The library validates arguments up front so the failure is synchronous and points at the exact argument.","triggerScenarios":"Calling AsyncObservable.SingleOrDefault(source, null) — e.g. a predicate stored in a variable that was never assigned, or a lambda passed through an intermediate API that returned null.","commonSituations":"Conditional predicate building where an empty filter list yields a null delegate; passing a method group on a null object; deserialized configuration producing a null delegate.","solutions":["Ensure a valid predicate delegate is supplied, e.g. x => true to match all elements.","If the filter is optional, branch: call the parameterless SingleOrDefault(source) overload when no predicate exists."],"exampleFix":"// before\nFunc<int, bool> pred = GetPredicate(); // may be null\nvar q = source.SingleOrDefault(pred);\n// after\nvar q = pred != null ? source.SingleOrDefault(pred) : source.SingleOrDefault();","handlingStrategy":"validation","validationCode":"if (source == null) throw new ArgumentNullException(nameof(source));\nif (predicate == null) throw new ArgumentNullException(nameof(predicate));\nvar q = source.SingleOrDefault(predicate);","typeGuard":"static bool IsValidPredicate<T>(Func<T, bool> p) => p != null;","tryCatchPattern":"try { var v = await source.SingleOrDefaultAsync(pred); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"predicate\") { pred = _ => true; }","preventionTips":["Default optional predicates to x => true instead of null.","Use non-nullable Func declarations so the compiler catches unassigned delegates."],"tags":["argument-null","predicate","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"}