The type parent?.Xis float?that you add to float, which leads to another float?. It cannot be implicitly converted to float.
Although Yuval's answer should work, I personally would use something like:
get
{
return (parent?.X ?? 0f) + position.X;
}
or
get
{
return (parent?.X).GetValueOrDefault() + position.X;
}
I'm not sure about your design, mind you - the fact that you add something to the getter, but not to the setter, is strange. It means that:
foo.X = foo.X;
... no-op, parent null X.