【问题标题】:how to overload methods with different parameter types in C#如何在 C# 中重载具有不同参数类型的方法
【发布时间】:2011-04-26 18:11:26
【问题描述】:

我正在尝试在 C# 中重载一个具有相同数量但类型不同的参数的方法。

private double scale(double value) 
{
    return value * 100 / scale;
}

private float scale(float value)
{
    return value * 100 / scale;
}

但我收到此错误

错误 4 类型 '[className]' 已经 包含“规模”的定义

注意:我在 MVS 2008 中工作

谢谢。

【问题讨论】:

  • 除数中的尺度变量从何而来?是班级成员吗?多看一些课程会很有帮助。

标签: c# overloading


【解决方案1】:

这段代码没有意义:

return value * 100 / scale;

如果你有一个方法名scale,那么行尾的scale是做什么的?

您的方法签名在语义上是正确的,因为这是完全合法的 C# 代码:

private float scale(float input)
{
    return input;
}

private double scale(double input)
{
    return input;
}

您的班级中似乎还有一个名为 scale 的字段或属性:

private float scale = 0.15f;

【讨论】:

  • +1 好电话。我需要更好地阅读所有发布的代码(我没有看到不同的输入类型,并且我错过了方法本身中对比例的使用......Doh!)。
  • @Justin 这里棘手的一点是未发布的代码,也就是必须存在的字段 scale 才能使错误有意义:)
  • 是的,这正是我的问题。我有一个名为 scale 的全局变量。我将其更改为 scaleValue,从而修复了它。非常感谢。
【解决方案2】:

对我来说,这是在抱怨您用作变量的比例。 你可以有这样的东西

    private double scale1 =  0.0d;
    private double scale(double value)
    {
        return value * 100 / scale1;
    }

    private float scale(float value)
    {
        return (float) (value * 100 / scale1);
    }

【讨论】:

    【解决方案3】:

    会不会是像调用方法一样调用成员变量?

    float scale2;
    private double scale(double value)
    {
        return value * 100 / scale2;
    }
    
    private float scale(float value)
    {
        return value * 100 / scale2;
    }
    

    这可以编译,但是您可能需要相同的返回类型。

    【讨论】:

      【解决方案4】:

      我认为这会给你带来麻烦。例如,如果参数是1.5,编译器如何知道您传递的是float 还是double

      除非您在这里有特殊需要,否则我会坚持使用double

      【讨论】:

      • “编译器是如何知道的” - 因为1.5 对编译器来说是双重的。 1.5f 将是浮动的。直截了当,整数文字推断为整数,十进制文字推断为双精度数。如果您想要longfloat(或decimal),则需要一个后缀(L、f 或 m,视情况而定)。
      • 1.5 被解释为双精度。如果您希望它是浮点数,请编写 1.5ffloat f = 1.5 以触发隐式转换。所以在编译器方面没有歧义。
      • 如果您调用这些函数 ScaleDouble 和 ScaleFloat,那么您可以将 1.5f 传递给它们,而无需任何强制转换或警告。那么如果它们都具有相同的名称,编译器会调用哪个?
      • @sgmoore:编译器将应用 C# 规范中记录的“更好”算法。在您的特定示例中,完全匹配总是比不完全匹配更好,因此将调用“浮动”匹配。如果存在不精确匹配并且两者都适用,则将调用“更具体”的版本。由于每只长颈鹿都是动物,但并非每只动物都是长颈鹿,所以长颈鹿更具体。由于每个浮点数都可以转换为双精度,但不是每个双精度都可以转换为浮点数,因此浮点数更具体,并且会选择浮点版本。
      • @Michael:编译器方面没有歧义,没有。但是在开发人员方面很容易混淆。
      【解决方案5】:

      您可以使用泛型。

      private T scale<T>(T value) where T: struct
      {
          return value * 100 / scale;
      }
      

      您可以用 float 或 double 或任何结构替换 T

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 2015-11-07
        • 2014-10-10
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        相关资源
        最近更新 更多