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

  1. Ensure the event-source object is created before composing the observable.
  2. Null-check or use a null-conditional/_assert pattern on the target before calling FromEventPattern.
  3. 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

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)