{"record":{"id":"ec9f38a7e27d5904","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-observer-sequenceequal","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'observer')","messagePattern":"Value cannot be null\\. \\(Parameter 'observer'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/SequenceEqual.cs","lineNumber":75,"sourceCode":"                    var firstTask = first.SubscribeSafeAsync(firstObserver);\n                    var secondTask = state.second.SubscribeSafeAsync(secondObserver);\n\n                    // REVIEW: Consider concurrent subscriptions.\n\n                    var d1 = await firstTask.ConfigureAwait(false);\n                    var d2 = await secondTask.ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(d1, d2);\n                });\n        }\n    }\n\n    public partial class AsyncObserver\n    {\n        public static (IAsyncObserver<TSource>, IAsyncObserver<TSource>) SequenceEqual<TSource>(IAsyncObserver<bool> observer)\n        {\n            if (observer == null)\n                throw new ArgumentNullException(nameof(observer));\n\n            return SequenceEqual(observer, EqualityComparer<TSource>.Default);\n        }\n\n        public static (IAsyncObserver<TSource>, IAsyncObserver<TSource>) SequenceEqual<TSource>(IAsyncObserver<bool> observer, IEqualityComparer<TSource> comparer)\n        {\n            if (observer == null)\n                throw new ArgumentNullException(nameof(observer));\n            if (comparer == null)\n                throw new ArgumentNullException(nameof(comparer));\n\n            var gate = new AsyncGate();\n\n            var queueLeft = new Queue<TSource>();\n            var queueRight = new Queue<TSource>();\n            var doneLeft = false;\n            var doneRight = false;\n","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/SequenceEqual.cs#L57-L93","documentation":"AsyncObserver.SequenceEqual<TSource>(observer) builds the pair of observers that feed a SequenceEqual comparison; it validates the downstream bool observer first. A null observer throws ArgumentNullException with parameter 'observer'.","triggerScenarios":"Calling AsyncObserver.SequenceEqual<TSource>(null) when manually composing observer pipelines (custom Create implementations) without a downstream observer.","commonSituations":"Hand-rolled operator composition where the downstream observer variable is null because an outer Subscribe callback received/created it incorrectly; misused CreateAsyncObservable.From overloads.","solutions":["Pass the actual downstream IAsyncObserver<bool> received in your subscription callback.","Verify you are using Create/CreateAsyncObservable correctly so observer is always provided by the framework.","Add a null guard before composing the observer pair.","Check you are not confusing the observer-factory overloads with the observable-factory SequenceEqual overloads."],"exampleFix":"// before\nreturn Create<bool>(observer => source.SubscribeSafeAsync(AsyncObserver.SequenceEqual<int>(null)));\n// after\nreturn Create<bool>(observer => source.SubscribeSafeAsync(AsyncObserver.SequenceEqual<int>(observer)));","handlingStrategy":"validation","validationCode":"if (observer is null) throw new ArgumentNullException(nameof(observer));","typeGuard":"static bool HasObserver<T>(IAsyncObserver<T>? o) => o is not null;","tryCatchPattern":"try { var pair = AsyncObserver.SequenceEqual<TSource>(observer); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"observer\") { /* fix composition — observer must come from Subscribe callback */ }","preventionTips":["Always forward the observer parameter given to your Create/Subscribe callback.","Do not manually construct observer pipelines without a downstream observer.","Keep operator composition inside CreateAsyncObservable/Create callbacks where observer is guaranteed."],"tags":["argument-null","sequenceequal","observer","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"}