2

如果我做,

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 方法。它也适用于我用小数替换浮点数的情况。

我可以对上述错误有一点解释吗?

4

4 回答 4

1

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

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

如果您在第二种情况下添加另一种方法,如下所示:

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

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

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

于 2013-02-15T11:01:28.173 回答
1

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

看看更好的函数成员定义。函数成员会更好,如果

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

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

于 2013-02-15T11:00:19.090 回答
1

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

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

test t  = new test();
t.add(1.0f, 2);
t.add(1, 2.0f);
于 2013-02-15T11:01:18.497 回答
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);
    }
}

只需查看此编码。

于 2013-02-15T11:35:01.130 回答