【问题标题】:c# method overload picks the wrong overload and compilesc#方法重载选择错误的重载并编译
【发布时间】:2020-07-20 11:32:09
【问题描述】:

我有以下几点:

EnErrorCodes WriteToCard(EnRegs address, byte data)
EnErrorCodes WriteToCard(EnRegs address, ushort data)
EnErrorCodes WriteToCard(EnRegs address, uint data)
EnErrorCodes WriteToCard(EnRegs address, float data)
EnErrorCodes WriteToCard(EnRegs address, double data)

但错过了ulong 重载。

当盲目地使用 ulong 的重载时,编译器选择了 float 重载而不是抛出错误。

花了很长时间才弄清楚为什么系统没有正确写入该数据,只是 ctrl+单击调用它的 WriteToCard 方法,然后将其带到浮点重载。

创建ulong 显然对其进行了排序,但我不明白为什么会发生这种情况,因为尝试查找它是一个相当烦人的功能。

【问题讨论】:

标签: c# overloading


【解决方案1】:

这是因为Implicit numeric conversion

如果您查看上图中突出显示的部分,C# 会将 ulong 转换为 floatdoubledecimal

由于您有 WriteToCard()float 参数,如果您将 dataulong 作为类型传递,编译器会将其隐式转换为浮点并执行它,而不是引发错误。

【讨论】:

    【解决方案2】:

    ulong 可以是implicitly convertedfloatdouble,所以selecting method overload 有两个有效的候选者。 float 之所以被选中,是因为它是better conversion target

    给定两种不同的类型 T1 和 T2,如果不存在从 T2 到 T1 的隐式转换,则 T1 是比 T2 更好的转换目标,并且至少满足以下一项:

    • 存在从 T1 到 T2 的隐式转换
    • ...

    所以没有从doublefloat的隐式转换,但是从floatdouble有一个

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多