在OOP方法中使用float重载会产生错误

时间:2013-02-15 10:57:13

标签: c# oop

如果我这样做,

public class test
{
    public int add(int a, float b)
    {
        return a + Convert.ToInt32(b);
    }

    public int add(float a, int b)
    {
        return Convert.ToInt32(a) + b;
    }
}

然后它成功编译但是给出了后期绑定运行时错误:

The call is ambiguous between the following methods or properties

但如果我这样做

public class test
{
    public int add(int a, float b)
    {
        return a + Convert.ToInt32(b);
    }

    public int add(int a, int b)
    {
        return Convert.ToInt32(a) + b;
    }
}

然后它正常工作并在test.add(1,2)的情况下调用第二个add方法。它也适用于我用float替换float。

我对上述错误的解释不多吗?

4 个答案:

答案 0 :(得分:1)

看起来您正在将两个整数或两个浮点数传递到 add 方法中。在第一种情况下,编译器可以将第一个参数转换为float或第二个参数。因此,您有两种方法可以调用。在第二种情况下,只需用两个整数调用 add

看看Better function member definition。如果

,函数成员会更好
  对于每个参数

,从 AX PX 的隐式转换并不会更糟   而不是从 AX QX

的隐式转换

但是对于你的方法的每个参数,这不是真的。因为如果你传递整数参数,只有第一个参数不会更糟。第二个论点更糟。 (反之亦然,花车)

答案 1 :(得分:1)

这是因为int可以隐式转换为float,因此编译器不知道是选择将第一个参数转换为float还是将第二个参数转换为float。它们都是同样有价值的转换。

在您的呼叫站点,通过使用float和int调用来解除歧义,而不是两个整数:

test t  = new test();
t.add(1.0f, 2);
t.add(1, 2.0f);

答案 2 :(得分:1)

int可隐式转换为float,因此在第一个示例中,编译器有两个等效选项,并且无法从调用add(1,2)决定使用哪个重载,因为没有提示为了他。

在第二种情况下,不需要转换,编译器选择最适合的重载。

如果您在第二个场景中添加其他方法,请执行以下操作:

public float add(float  a, float b)
{
    return a + b;
}

并使用显式类型的参数调用它,例如add(1f, 3); - 它将被调用

不深入细节,编译器总是尝试选择最合适的重载并尝试尽可能减少约定。如果它存在歧义 - 它会引发错误。

答案 3 :(得分:0)

我已经尝试了自己的编码部分。没有错误。

class Program
{

        public int add(int a, float b)
        {
            return a + Convert.ToInt32(b);
        }

        public int add(float a, int b)
        {
            return Convert.ToInt32(a) + b;
        }

    static void Main(string[] args)
    {

        Program pr = new Program();
       int k= pr.add(12, 203.9f);
       int kk = pr.add(203.9f, 12);
       Console.WriteLine(k);
       Console.WriteLine(kk);
    }
}

请查看此编码。