我有这样的示例代码:
static void Main()
{
dynamic dynamicObject = null;
object simpleObject = dynamicObject + new AnyClass();
Console.WriteLine(simpleObject);
}
class AnyClass
{
public override string ToString()
{
return "text";
}
}
执行结果为:
text
如果我理解正确的话,那么
dynamicObject + new AnyClass()
部分会调用字符串连接,它会为dynamicObject
返回空字符串,因为它引用null
,并且new AnyClass()
返回text
。但是没有调用 ToString()
所必需的字符串参数。为什么会出现这样的情况呢?为什么没有生成关于未执行“+”操作的异常?
+
具有以下重载(并非详尽列表)。
string operator +(string x, string y);
string operator +(string x, object y);
string operator +(object x, string y);
decimal operator +(decimal x, decimal y);
int operator +(int x, int y);
long operator +(long x, long y);
float operator +(float x, float y);
double operator +(double x, double y);
当您执行
dynamicObject + new AnyClass()
时,运行时需要从此列表中选择最佳重载。由于 dynamicObject
为 null,因此它与任何引用类型兼容。因此,所有采用值类型的重载都被消除。将 string
作为第二个参数的那些被消除,因为 new AnyClass()
不是 string
,我们可以得出:
string operator +(object x, string y);
string operator +(string x, string y);
null
和new AnyClass()
都兼容这两者的参数类型。由于第二个比第一个“更具体”,因此选择第二个。