为什么这个演员多余?

fer*_*ero 71 c# casting overloading

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

string Call(string function, Dictionary<string, object> parameters, object body)
string Call(string function, Dictionary<string, object> parameters, JObject body)
Run Code Online (Sandbox Code Playgroud)

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

string Call(string function)
{
    return Call(function, null, (JObject) null);
}
Run Code Online (Sandbox Code Playgroud)

我添加了一个强制转换,JObject因此编译器知道它应该使用哪个重载.但Visual Studio告诉我演员阵容是多余的.但是如果没有演员,为什么我的电话不明确?

Jon*_*eet 97

但是如果没有演员,为什么我的电话不明确?

因为与过载JObject参数比与过载"更好"的object参数......因为从转换nullJObject比从转换"更好" nullobject.

JObject比更具体的object,因为有一个从隐式转换JObjectobject,而不是相反.

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

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

  • 即使它今天存在一个转换是没有必要带班,未能投了`null`会使调用代码很脆,因为加*几乎所有的*额外的引用类型的过载会破坏调用代码没有按不要演员.我不认为任何空引用的转换都是"冗余的",如果有任何实际可能存在可能变得模糊的额外引用类型重载,或者甚至在特殊重载被认为"更好"的情况下也是如此.规则,但在任何实际意义上它都更好. (8认同)
  • @supercat如果你真的想手动指定过载,为什么不只是有一个新的唯一命名函数? (8认同)
  • @supercat:C++ 11及更高版本引入了`nullptr_t`,它可以用作参数类型.但空指针文字仍然可以隐式转换为`int`和对象指针类型,因此对重载解析没有多大帮助.C++(所有版本)中的尾随可变参数列表(`...`)非常适合使特定的过载不太受欢迎. (2认同)