如果我这样做,
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。
我对上述错误的解释不多吗?
答案 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);
}
}
请查看此编码。