C# 为什么这个演员是多余的?

C# 为什么这个演员是多余的?,c#,casting,overloading,C#,Casting,Overloading,我有一个具有以下重载的方法: string Call(string function, Dictionary<string, object> parameters, object body) string Call(string function, Dictionary<string, object> parameters, JObject body) 我向JObject添加了一个cast,以便编译器知道应该使用哪个重载。但是VisualStudio告诉我演员阵容是多余

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

string Call(string function, Dictionary<string, object> parameters, object body)
string Call(string function, Dictionary<string, object> parameters, JObject body)
我向
JObject
添加了一个cast,以便编译器知道应该使用哪个重载。但是VisualStudio告诉我演员阵容是多余的。但是为什么没有演员我的电话不是模棱两可的

但是为什么没有演员我的电话不是模棱两可的

因为
JObject
参数的重载比
object
参数的重载“更好”。。。因为从
null
JObject
的转换比从
null
object
的转换“更好”

JObject
object
更具体,因为存在从
JObject
object
的隐式转换,但不是相反

如果第一个方法的最后一个参数是
string
(例如),那么两个重载都不会比另一个好,并且如果没有强制转换,调用将是不明确的


所有复杂的细节见C#5规范第7.5.3节。特别是,第7.5.3.5节(“更好的转换目标”)与此相关。

即使它对编译器来说并不含糊,我也会保留该转换,因为它对阅读该转换的人来说可能是含糊不清的code@jean不,那不是原因。我告诉编译器使用哪个重载。使用哪种方法重载确实很重要,因为它们可能有完全不同的实现
null
null
,但这里的强制转换提示应该使用哪个重载。@jean,恐怕这又错了。强制转换只是多余的,因为即使我没有强制转换到
JObject
,编译器仍将使用
JObject
重载,因为它使用与参数匹配的最具体的重载,
null
可以匹配任何内容,
JObject
对象更具体。请参阅Jon Skeet的答案以获得详细解释。即使像现在这样的类不需要强制转换,如果未能强制转换
null
将使调用代码非常脆弱,因为添加几乎任何额外的引用类型重载都会破坏不强制转换的调用代码。我不认为任何引用空引用都是“多余的”,在这种情况下,有可能出现额外的引用类型重载,可能会变得模糊不清,甚至在特定的过载被规则认为是“更好”的情况下,但在任何实际的情况下,它都不太明显。长期以来,我一直认为使用属性或其他方法来指定某些重载的语言将从中受益匪浅,如果它们是可用的,则应将其视为“首选”,而其他语言则应仅视为“回退”;我还认为,如果重载可以指定
null
的参数类型,这将非常有用。你知道有哪种语言可以做这样的事情吗?@supercat:Nope,恐怕没有。@supercat:C++11以及后来介绍的
nullptr\t
,它可以用作参数类型。但是空指针文本仍然可以隐式转换为
int
和对象指针类型,因此这对重载解析没有多大帮助。C++中的一个后继变量参数列表(…> /Cuff>)很适合于使一个特定的重载不那么好。@ SupeCAT如果你真的想手动指定过载,为什么不只是有一个新的唯一命名函数?
string Call(string function)
{
    return Call(function, null, (JObject) null);
}