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

本文关键字:float 错误 OOP 方法 重载 | 更新日期: 2023-09-27 17:59:36

如果我这样做,

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时,它也工作。

我能对以上错误作一点解释吗?

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

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

在您的呼叫站点,通过使用float和int(而不是两个int)进行呼叫来禁用:

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

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

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

如果你在第二个场景中添加另一种方法,比如:

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

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

编译器不深入研究细节,总是试图选择最合适的重载,并尽可能减少约定。如果它陷入歧义,就会抛出一个错误。

看起来您正在将两个整数或两个浮点值传递到add方法中。在第一种情况下,编译器可以将第一个参数转换为浮点值,也可以将第二个参数转换成浮点值。因此,您可以调用两个方法。在第二种情况下,In简单地调用,用两个整数加上

看看Better函数成员定义。功能成员会更好,如果

对于每个参数,从AXPX的隐式转换并不差从AXQX的隐式转换,以及

但对于方法的每个参数,情况并非如此。因为若要传递整数参数,那个么只有第一个参数不会更糟。第二个论点更糟。(浮动反之亦然)

我已经尝试过您自己的编码部分。没有出现错误。

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);
    }
}

看看这个编码就知道了。