dotnet/reactive · error · ArgumentNullException
nameof(target)
Error message
nameof(target)
What it means
ArgumentNullException thrown by the reflection-based FromEventPattern(object target, string eventName, IAsyncScheduler scheduler) overload when target is null. This overload later calls target.GetType(), so a null target would crash with NullReferenceException; the library converts that into a descriptive ArgumentNullException naming the target parameter.
Solutions
- Ensure the event-source object is created before composing the observable.
- Null-check or use a null-conditional/_assert pattern on the target before calling FromEventPattern.
- If the source may come and go, wrap resolution in an observable factory that only subscribes when the target exists.
Example fix
// before
var obs = AsyncObservable.FromEventPattern(control, "Click"); // control == null
// after
if (control is null) throw new InvalidOperationException("Control not found");
var obs = AsyncObservable.FromEventPattern(control, "Click"); Defensive patterns
Strategy: validation
Validate before calling
if (target is null) throw new InvalidOperationException("Event source object not initialized"); Type guard
static bool IsLiveSource<T>(T target) where T : class => target is not null;
Try / catch
try
{
var obs = AsyncObservable.FromEventPattern(target, eventName);
}
catch (ArgumentNullException ex) when (ex.ParamName == nameof(target))
{
logger.LogError(ex, "Event source {Name} was null", eventName);
} Prevention
- Resolve controls/objects before composing observables, not lazily inside subscriptions.
- Use null-conditional checks or throw descriptive exceptions at call sites.
- In UI code, hook events after InitializeComponent/load completes.
When it happens
Trigger: Calling FromEventPattern(null, "Click") or (null, "Click", scheduler) — usually the event source was lazily created, unloaded, or a WeakReference/optional dependency resolved to null.
Common situations: WPF/WinForms scenarios where a control reference is null because FindName failed or the visual tree changed; events on objects that were disposed and nulled out; test fixtures with uninitialized subjects.
Related errors
AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15).
Data as JSON: /api/errors/b513136b1df4dc2f.
Report an issue: GitHub.
Appendix: source
Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/FromEventPattern.cs:97
public static IAsyncObservable<EventPattern<TEventArgs>> FromEventPattern<TEventArgs>(Action<EventHandler<TEventArgs>> addHandler, Action<EventHandler<TEventArgs>> removeHandler, IAsyncScheduler scheduler)
{
if (addHandler == null)
throw new ArgumentNullException(nameof(addHandler));
if (removeHandler == null)
throw new ArgumentNullException(nameof(removeHandler));
if (scheduler == null)
throw new ArgumentNullException(nameof(scheduler));
return FromEvent<EventHandler<TEventArgs>, object, TEventArgs>(action => ConvertDelegate<Action<object, TEventArgs>, EventHandler<TEventArgs>>(action), addHandler, removeHandler, scheduler).Select(t => new EventPattern<TEventArgs>(t.arg1, t.arg2));
}
public static IAsyncObservable<EventPattern<object>> FromEventPattern(object target, string eventName) => FromEventPattern(target, eventName, GetSchedulerForCurrentContext());
public static IAsyncObservable<EventPattern<object>> FromEventPattern(object target, string eventName, IAsyncScheduler scheduler)
{
if (target == null)
throw new ArgumentNullException(nameof(target));
if (eventName == null)
throw new ArgumentNullException(nameof(eventName));
if (scheduler == null)
throw new ArgumentNullException(nameof(scheduler));
return FromEventPatternCore<object, object, EventPattern<object>>(target.GetType(), target, eventName, scheduler, (o, e) => new EventPattern<object>(o, e));
}
public static IAsyncObservable<EventPattern<TEventArgs>> FromEventPattern<TEventArgs>(object target, string eventName) => FromEventPattern<TEventArgs>(target, eventName, GetSchedulerForCurrentContext());
public static IAsyncObservable<EventPattern<TEventArgs>> FromEventPattern<TEventArgs>(object target, string eventName, IAsyncScheduler scheduler)
{
if (target == null)
throw new ArgumentNullException(nameof(target));
if (eventName == null)
throw new ArgumentNullException(nameof(eventName));
if (scheduler == null)
throw new ArgumentNullException(nameof(scheduler));View on GitHub (pinned to 94b5d5ab91)