{"record":{"id":"12e98d7f4704a6a6","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-predicate-single","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'predicate')","messagePattern":"Value cannot be null\\. \\(Parameter 'predicate'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/Single.cs","lineNumber":28,"sourceCode":"    {\n        public static IAsyncObservable<TSource> SingleAsync<TSource>(this IAsyncObservable<TSource> source) => Single(source);\n        public static IAsyncObservable<TSource> SingleAsync<TSource>(this IAsyncObservable<TSource> source, Func<TSource, bool> predicate) => Single(source, predicate);\n        public static IAsyncObservable<TSource> SingleAsync<TSource>(this IAsyncObservable<TSource> source, Func<TSource, ValueTask<bool>> predicate) => Single(source, predicate);\n\n        public static IAsyncObservable<TSource> Single<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.Single(observer)));\n        }\n\n        public static IAsyncObservable<TSource> Single<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.Single(observer, predicate)));\n        }\n\n        public static IAsyncObservable<TSource> Single<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.Single(observer, predicate)));","sourceCodeStart":10,"sourceCodeEnd":46,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/Single.cs#L10-L46","documentation":"Thrown by the Single(source, Func<TSource,bool>) overload when the predicate delegate is null. The library validates both source and predicate before creating the operator pipeline. Without the guard the null would only explode when the first element is evaluated, far from the actual bug.","triggerScenarios":"Calling SingleAsync(source, predicate) with a null predicate delegate, e.g. a lambda stored in a nullable field that was never initialized.","commonSituations":"Predicates built dynamically or read from configuration; refactoring that removed a lambda but left the call; passing a method group on a null object.","solutions":["Pass a valid non-null Func<TSource,bool> predicate","If no filtering is intended, call the parameterless SingleAsync(source) overload instead","Verify any variable holding the predicate is assigned before the call"],"exampleFix":"// before\nFunc<int, bool> pred = GetPredicate(); // may be null\nvar result = await source.SingleAsync(pred);\n// after\nvar result = await source.SingleAsync(x => x > 0);","handlingStrategy":"validation","validationCode":"if (predicate is null) throw new InvalidOperationException(\"predicate must not be null\");","typeGuard":"static bool IsValidPredicate<T>(Func<T, bool>? p) => p is not null;","tryCatchPattern":"try { var v = await source.SingleAsync(pred); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"predicate\") { /* use default predicate */ }","preventionTips":["Default predicates to x => true rather than null","Check nullable delegate fields before use","Prefer the parameterless overload when no filter is needed"],"tags":["csharp","null-check","predicate","asyncrx"],"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"}