C# 函数重载:不明确的调用

C# Function Overloading : Ambiguous Call

由于参数排列不同,得到模棱两可的调用:short,int / int,short /byte,int / int,byte

因为函数签名是:

1.Number of arguments/parameters

2.Type of arguments/parameters

3.Arrangement of arguments/parameters

为什么调用不明确?应该属于同类吗?...

代码:

class Program
{
    static void Main(string[] args)
    {

        test abbb = new test();
        //abbb.add(2.2f,1);
        // abbb.add(2,2.2f);
        abbb.add(255,1);
        abbb.add(1,256);
        Console.ReadLine();
    }
}

class test
{
    public int add(byte i , int f) {
       return i + f;
    }
    public int add(int i, byte f)
    {
        return i + f;
    }
    public int add(short i, int f)
    {
        return i + f;
    }
    public int add(int i, short f)
    {
        return i + f;
    }
}

这是有歧义的,因为C#不知道这两个数字中的哪个是哪个类型。 1 和 256 都可能是 short,也可能是 int。 您可以对其中一种方法使用显式转换 "choose"。

默认情况下,任何 'Magic Number' 都将被视为整数,但有时为了便于使用,编译器如果有足够的信息可以隐式转换为另一种数字格式。 为了避免模棱两可的调用,您最好先为数字显式定义类型化变量,然后将它们传递给函数以消除任何歧义。

class Program
   {       
    static void Main(string[] args)
    {           
        test abbb = new test();

        Console.WriteLine(abbb.add(32767, 32770)); //short , int
        Console.WriteLine(abbb.add(32770, 32767)); //int ,short
        Console.WriteLine(abbb.add(255, 32770)); // byte,int
        Console.WriteLine(abbb.add(32770, 255)); // int,byte

        Console.ReadLine();
    }
}
class test
{       
    public int add(byte f, int i)
    {
        return i + f;
    }

    public int add(int i, byte f)
    {
        return i + f;
    }
    public int add(short i, int f)
    {
        return i + f;
    }
    public int add(int f, short i)
    {
        return i + f;
    }
}

由于提到的特定类型范围,没有歧义...