{"record":{"id":"e22c4c87e0965d4a","repo":"dotnet/reactive","slug":"conversion","errorCode":null,"errorMessage":"conversion","messagePattern":"conversion","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEvent.cs","lineNumber":83,"sourceCode":"            return FromEventCore<Action, Unit>(h => () => h(Unit.Default), addHandler, removeHandler, GetSchedulerForCurrentContext());\n        }\n\n        public static IAsyncObservable<Unit> FromEvent(Action<Action> addHandler, Action<Action> removeHandler, IAsyncScheduler scheduler)\n        {\n            if (addHandler == null)\n                throw new ArgumentNullException(nameof(addHandler));\n            if (removeHandler == null)\n                throw new ArgumentNullException(nameof(removeHandler));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            return FromEventCore<Action, Unit>(h => () => h(Unit.Default), addHandler, removeHandler, scheduler);\n        }\n\n        public static IAsyncObservable<TEventArgs> FromEvent<TDelegate, TEventArgs>(Func<Action<TEventArgs>, TDelegate> conversion, Action<TDelegate> addHandler, Action<TDelegate> removeHandler)\n        {\n            if (conversion == null)\n                throw new ArgumentNullException(nameof(conversion));\n            if (addHandler == null)\n                throw new ArgumentNullException(nameof(addHandler));\n            if (removeHandler == null)\n                throw new ArgumentNullException(nameof(removeHandler));\n\n            return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext());\n        }\n\n        public static IAsyncObservable<TEventArgs> FromEvent<TDelegate, TEventArgs>(Func<Action<TEventArgs>, TDelegate> conversion, Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IAsyncScheduler scheduler)\n        {\n            if (conversion == null)\n                throw new ArgumentNullException(nameof(conversion));\n            if (addHandler == null)\n                throw new ArgumentNullException(nameof(addHandler));\n            if (removeHandler == null)\n                throw new ArgumentNullException(nameof(removeHandler));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEvent.cs#L65-L101","documentation":"The generic FromEvent<TDelegate, TEventArgs> requires a conversion function that turns Action<TEventArgs> into the target delegate type. When conversion is null the guard throws ArgumentNullException with ParamName \"conversion\" because the operator cannot bridge the framework event delegate to the handler pipeline.","triggerScenarios":"Calling FromEvent<TDelegate, TEventArgs>(null, addHandler, removeHandler), e.g. omitting the conversion lambda when subscribing to a non-Action event like EventHandler or a custom delegate.","commonSituations":"Subscribing to events whose delegate type is not Action<TEventArgs> (EventHandler, PropertyChangedEventHandler) and leaving the conversion slot empty; constructing the arguments dynamically where the converter string/delegate is null.","solutions":["Supply the conversion lambda, e.g. h => (EventHandler)h for EventHandler-based events.","Use the non-generic FromEvent(Action<Action>, ...) overload if the event already accepts Action.","Use FromEventPattern for EventHandler events, which supplies the conversion internally."],"exampleFix":"// before\nvar sub = AsyncRx.Observable.FromEvent<EventHandler, EventArgs>(null, h => src.Clicked += h, h => src.Clicked -= h);\n// after\nvar sub = AsyncRx.Observable.FromEvent<EventHandler, EventArgs>(h => (EventHandler)((_, e) => h(e)), h => src.Clicked += h, h => src.Clicked -= h);","handlingStrategy":"validation","validationCode":"if (conversion == null) conversion = h => (EventHandler)((_, e) => h(e));","typeGuard":"bool HasConversion<TDelegate, TEventArgs>(Func<Action<TEventArgs>, TDelegate> conversion) => conversion != null;","tryCatchPattern":"try { var sub = FromEvent<TDelegate, TEventArgs>(conversion, add, remove); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"conversion\") { /* build a default conversion for the delegate type */ }","preventionTips":["Remember the generic FromEvent overload has no default conversion; the non-generic one does.","For EventHandler-based events prefer FromEventPattern.","Keep a small library of standard conversion lambdas per delegate type."],"tags":["csharp","argument-null","fromevent","delegates","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"}