为什么使用dynamic obj + class obj时会调用串联?

问题描述 投票:0回答:1

我有这样的示例代码:

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()
所必需的字符串参数。为什么会出现这样的情况呢?为什么没有生成关于未执行“+”操作的异常?

c# dynamic null concatenation
1个回答
0
投票

这只是操作符重载解析的问题。

+
具有以下重载(并非详尽列表)。

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()
都兼容这两者的参数类型。由于第二个比第一个“更具体”,因此选择第二个。

© www.soinside.com 2019 - 2024. All rights reserved.