dotnet/wpf · error · ArgumentNullException

null argument: targetObject

Error message

null argument: targetObject

What it means

ReceiveTypeConverter is the XAML callback invoked when a type converter sets a property on a Setter during XAML parsing. The first parameter must be the Setter instance being populated; if targetObject is null or not castable to Setter, ArgumentNullException is thrown (message 'null argument: targetObject').

Solutions

  1. Pass the actual Setter instance as targetObject when invoking the callback.
  2. Ensure the XAML object being constructed really is a Setter before routing the callback to it.
  3. If building tooling, instantiate the Setter first (or let the XAML engine construct it) before raising the type-converter callback.

Example fix

// before
Setter.ReceiveTypeConverter(null, eventArgs);
// after
Setter.ReceiveTypeConverter(mySetterInstance, eventArgs);
Defensive patterns

Strategy: type-guard

Validate before calling

if (targetObject is not Setter setter) throw new ArgumentNullException(nameof(targetObject));

Type guard

static bool IsSetterCallbackTarget(object o) => o is Setter;

Try / catch

try { Setter.ReceiveTypeConverter(obj, args); }
catch (ArgumentNullException) { /* pass the real Setter instance */ }

Prevention

When it happens

Trigger: Calling Setter.ReceiveTypeConverter(null, args) directly, or a custom XAML schema context/serializer invoking the callback with a non-Setter target object.

Common situations: Custom XAML infrastructure or unit tests invoking the callback manually; tooling that re-implements XAML parsing of styles.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/da0029091b470327. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Setter.cs:249

            if (me is StaticResourceExtension)
            {
                var sr = me as StaticResourceExtension;
                setter.Value = sr.ProvideValueInternal(eventArgs.ServiceProvider, true /*allowDeferedReference*/);
                eventArgs.Handled = true;
            }
            else if (me is DynamicResourceExtension || me is BindingBase)
            {
                setter.Value = me;
                eventArgs.Handled = true;
            }
        }

        public static void ReceiveTypeConverter(object targetObject, XamlSetTypeConverterEventArgs eventArgs)
        {
            Setter setter = targetObject as Setter;
            if (setter == null)
            {
                throw new ArgumentNullException(nameof(targetObject));
            }
            ArgumentNullException.ThrowIfNull(eventArgs);

            if (eventArgs.Member.Name == "Property")
            {
                setter._unresolvedProperty = eventArgs.Value;
                setter._serviceProvider = eventArgs.ServiceProvider;
                setter._cultureInfoForTypeConverter = eventArgs.CultureInfo;

                eventArgs.Handled = true;
            }
            else if (eventArgs.Member.Name == "Value")
            {
                setter._unresolvedValue = eventArgs.Value;
                setter._serviceProvider = eventArgs.ServiceProvider;
                setter._cultureInfoForTypeConverter = eventArgs.CultureInfo;

                eventArgs.Handled = true;

View on GitHub (pinned to 81131a70a4)