Lacking reputation to upvote Michael Wagner's elegant answer, I offer a slight improvement.
public class PropertyCastExtension<T>(T value) : MarkupExtension
{
[ConstructorArgument("value")]
public T Value { get; } = value;
public override object ProvideValue(IServiceProvider serviceProvider) => Value!;
}
[MarkupExtensionReturnType(typeof(int))]
public class IntExtension(int value) : PropertyCastExtension<int>(value) { }
[MarkupExtensionReturnType(typeof(double))]
public class DoubleExtension(double value) : PropertyCastExtension<double>(value) { }