【问题标题】:Why is this cast redundant?为什么这个演员阵容是多余的?
【发布时间】:2015-10-23 02:02:49
【问题描述】:

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

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 告诉我演员阵容是多余的。但是为什么没有演员表我的电话不模棱两可?

【问题讨论】:

  • 即使它对编译器来说并不模棱两可,我也会将演员表保留在那里,因为它对阅读代码的人来说可能是模棱两可的
  • @jean 不,这不是原因。我告诉编译器使用哪个重载。并且使用哪个方法重载确实很重要,因为它们可能具有完全不同的实现。 nullnull,但这里的演员表暗示应该使用哪个重载。
  • @jean 恐怕这又错了。强制转换只是多余的,因为即使我不强制转换为JObject,编译器仍然会使用JObject 重载,因为它使用与参数匹配的最具体的重载,并且null可以匹配任何内容,并且JObject object 更具体。有关详细说明,请参阅 Jon Skeet 的回答。

标签: c# casting overloading


【解决方案1】:

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

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

JObjectobject 更具体,因为存在从 JObjectobject 的隐式转换,但反之则不然。

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

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

【讨论】:

  • 即使现在的类不需要强制转换,如果没有强制转换null 将使调用代码非常脆弱,因为添加了几乎任何 i> 额外的引用类型重载会破坏不强制转换的调用代码。我不会认为空引用的任何强制转换是“冗余的”,如果存在任何可能变得模棱两可的额外引用类型重载的实际可能性,甚至在特定重载被认为“更好”的情况下规则,但在任何实际意义上它都不是更好。
  • 顺便说一句,我一直认为具有重载的语言将从使用属性或其他一些方法来指定某些重载的方法中受益匪浅,如果它们可用,则应将其视为“首选”,而其他应仅被视为“后备”;我还认为如果重载可以指定null 的参数类型会很有帮助。你知道有什么语言可以做这样的事情吗?
  • @supercat:不,恐怕不会。
  • @supercat:C++11及以后引入nullptr_t,可以作为参数类型。但是空指针字面量仍然可以隐式转换为int 和对象指针类型,因此这对重载解析没有多大帮助。 C++(所有版本)中的尾随可变参数列表 (...) 非常适合使特定的重载不那么受欢迎。
  • @supercat 如果你真的想手动指定重载,为什么不使用一个新的唯一命名的函数呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2016-03-06
  • 2022-11-20
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多