为什么这个铸件是多余的?

我有一个带有以下重载的方法:

string Call(string function, Dictionary<string, object> parameters, object body)
string Call(string function, Dictionary<string, object> parameters, JObject body)

现在我添加了另一个过载:

string Call(string function)
{
return Call(function, null, (JObject) null);
}

我向 JObject添加了一个强制转换,以便编译器知道它应该使用哪个重载。但是 Visual Studio 告诉我演员阵容是多余的。但是为什么没有石膏我的呼叫不模糊呢?

11076 次浏览

但是为什么没有石膏我的呼叫不模糊呢?

因为使用 JObject参数的重载比使用 object参数的重载“更好”... 因为从 nullJObject的转换比从 nullobject的转换“更好”。

JObjectobject更具体,因为有一个从 JObjectobject的隐式转换,但反之亦然。

如果第一个方法的最终参数是 string(例如) ,那么任何一个重载都不会比另一个重载好,如果没有强制转换,那么调用 就是不明确的。

有关所有复杂的细节,请参阅 C # 5规范的7.5.3部分。特别是,7.5.3.5节(“更好的转换目标”)在这里是相关的。