{"record":{"id":"16ded62216cb4afa","repo":"dotnet/reactive","slug":"source-windowsobservable-events","errorCode":null,"errorMessage":"source","messagePattern":"source","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"Rx.NET/Source/src/System.Reactive/Platforms/WinRT/Linq/WindowsObservable.Events.cs","lineNumber":111,"sourceCode":"                {\n                    removeHandler(h);\n                };\n            });\n        }\n\n        /// <summary>\n        /// Exposes an observable sequence as an object with a typed event.\n        /// </summary>\n        /// <typeparam name=\"TSender\">The type of the sender that raises the event.</typeparam>\n        /// <typeparam name=\"TEventArgs\">The type of the event data generated by the event.</typeparam>\n        /// <param name=\"source\">Observable source sequence.</param>\n        /// <returns>The event source object.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"source\"/> is null.</exception>\n        public static IEventPatternSource<TSender, TEventArgs> ToEventPattern<TSender, TEventArgs>(this IObservable<EventPattern<TSender, TEventArgs>> source)\n        {\n            if (source == null)\n            {\n                throw new ArgumentNullException(nameof(source));\n            }\n\n            return new EventPatternSource<TSender, TEventArgs>(source, static (h, evt) => h(evt.Sender!, evt.EventArgs));\n        }\n    }\n}\n#endif\n","sourceCodeStart":93,"sourceCodeEnd":119,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Rx.NET/Source/src/System.Reactive/Platforms/WinRT/Linq/WindowsObservable.Events.cs#L93-L119","documentation":"ToEventPattern exposes an observable of WinRT event patterns as an object with a typed event; the source is validated because there would be no stream of (sender, args) pairs to forward to added handlers. Fix: pass a non-null IObservable<EventPattern<...>> from WindowsObservable.FromEventPattern.","triggerScenarios":"Calling observable.ToEventPattern<TSender,TEventArgs>() where the IObservable<EventPattern<TSender,TEventArgs>> is null, e.g. from an optional chain or an uninitialized field.","commonSituations":"Bridging Rx pipelines back to legacy event handlers where the observable was built conditionally; passing the result of a method that returns null on failure.","solutions":["Ensure the source observable is non-null before calling ToEventPattern","Provide Observable.Empty<EventPattern<TSender,TEventArgs>>() as a non-null fallback","Check upstream operator chains for null-producing factory methods","Use nullable reference type annotations to catch this at compile time"],"exampleFix":"// before\nIObservable<EventPattern<object, RoutedEventArgs>> obs = null;\nvar src = obs.ToEventPattern();\n// after\nvar src = (obs ?? Observable.Empty<EventPattern<object, RoutedEventArgs>>()).ToEventPattern();","handlingStrategy":"validation","validationCode":"if (source == null) throw new ArgumentNullException(nameof(source));\nvar safe = source ?? Observable.Empty<EventPattern<TSender, TEventArgs>>();","typeGuard":"static IObservable<EventPattern<TS, TEA>> NonNullSource<TS, TEA>(IObservable<EventPattern<TS, TEA>> s) => s ?? Observable.Empty<EventPattern<TS, TEA>>();","tryCatchPattern":"try { var src = obs.ToEventPattern(); }\ncatch (ArgumentNullException ex) { Log($\"{ex.ParamName} null when converting to event pattern\"); }","preventionTips":["Never return null observables from factory methods; use Observable.Empty","Enable nullable reference types","Check upstream chains for null-producing optional calls","Unit-test bridge conversions with non-null inputs"],"tags":["rx","null-argument","events","winrt"],"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"}