为何dynamic对象与类对象执行+运算时会调用字符串拼接?
dynamic对象与自定义类相加的行为解析
先贴出你的示例代码:
static void Main() { dynamic dynamicObject = null; object simpleObject = dynamicObject + new AnyClass(); Console.WriteLine(simpleObject); } class AnyClass { public override string ToString() { return "text"; } }
执行结果:
text
核心原因解析
之所以没有抛出异常且得到text结果,关键在于**.NET中string类型的+运算符包含接受object参数的重载**:
public static string operator + (object? left, object? right);
当dynamic参与运算时,绑定逻辑是在运行时完成的,而非编译时:
- 运行时识别到
dynamicObject实际为null(属于object类型的null),new AnyClass()也是object实例。 - 由于没有自定义的
+运算符适配这两个类型,运行时会匹配到string的上述重载。 - 这个重载会自动将两个
object参数转换为字符串:null直接转为空字符串,AnyClass实例通过调用ToString()得到"text"。 - 最终执行空字符串与
"text"的拼接,得到结果"text"。
你的猜测方向是对的,只是没意识到string的+运算符本身就支持直接传入object参数,不需要显式触发ToString()——这个重载内部已经帮你完成了类型转换和方法调用。
内容的提问来源于stack exchange,提问作者IT demon
相关产品推荐
相关产品推荐

