为什么这个铸造是多余的?
我有一个方法有以下重载:
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
参数的重载“更好”,因为从null
到JObject
的转换比从null
到object
的转换“更好”。
JObject
比object
更具体,因为有一个从JObject
到object
的隐式转换,但反之亦然。
如果第一个方法的最后一个参数是string
(例如),那么重载不会比另一个更好,并且调用在没有强制转换的情况下是模糊的。
有关所有复杂细节,请参阅C#5规范的第7.5.3节。 特别是,第7.5.3.5节(“更好的转换目标”)在这里是相关的。