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

C#函数重载:不明确的调用,c#,overloading,ambiguous,overload-resolution,C#,Overloading,Ambiguous,Overload Resolution,参数的排列方式不同:short、int/int、short/byte、int/int、byte 由于函数签名是: 1.参数/参数的数量 2.参数/参数的类型 3.论点/参数的安排 为什么这个电话模棱两可?它应该属于类似的类型吗 代码: 这是不明确的,因为C#不知道这两个数字中的哪一个是哪一种类型。 1和256都可以是短的,都可以是整数。 您可以使用显式转换来“选择”其中一种方法。默认情况下,任何方法都将被视为整数,但有时为了便于使用,编译器可以隐式转换为另一种数字格式,前提是它具有足够的信息。

参数的排列方式不同:short、int/int、short/byte、int/int、byte

由于函数签名是:

1.参数/参数的数量

2.参数/参数的类型

3.论点/参数的安排

为什么这个电话模棱两可?它应该属于类似的类型吗

代码:

这是不明确的,因为C#不知道这两个数字中的哪一个是哪一种类型。 1和256都可以是短的,都可以是整数。 您可以使用显式转换来“选择”其中一种方法。

默认情况下,任何方法都将被视为整数,但有时为了便于使用,编译器可以隐式转换为另一种数字格式,前提是它具有足够的信息。 为了避免不明确的调用,最好先为数字显式定义类型化变量,然后将它们传递到函数中以消除任何不明确性

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

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

不正确--C#非常清楚两个文本都是整数。@Jeroenvanevel是的,它知道两个文本都是整数。但是没有具有(int,int)签名的函数,因此编译器尝试隐式转换其中一个值。因为两者都可能被转换成一个短的C#不知道调用哪一个。你能逐步完成你认为应该是所选重载的过程吗?如果你想得到答案,也可以通过C语言规范来实现。看看如果你添加一个需要两个整数的方法会发生什么。现在没有错误,因为两个整数常量有一个完全匹配的目标。缺少的是,编译器只能找到作为第一个参数的两个方法,第一个参数是整数,但是它不能决定是将第二个参数转换为字节还是短参数
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;
    }
}