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

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

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添加了一个JObject以便编译器知道应该使用哪个超载。 但是,Visual Studio告诉我,演员是多余的。 但是为什么我的电话没有演员模糊呢?

但是为什么我的电话没有演员模糊呢?

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

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

如果第一个方法的最后一个参数是string (例如),那么重载不会比另一个更好,并且调用在没有强制转换的情况下是模糊的。

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