【问题标题】:C# Function Overloading : Ambiguous CallC# 函数重载:不明确的调用
【发布时间】:2016-02-16 20:05:21
【问题描述】:

由于参数排列不同,得到模糊调用:short,int / int,short /byte,int / int,byte

因为函数签名是:

1.参数/参数个数

2.参数/参数的类型

3.自变量/参数的排列

为什么调用不明确?它应该属于相似的类型吗?...

代码:

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# 语言规范来做到这一点。
  • 看看如果你添加一个需要两个整数的方法会发生什么。现在没有错误,因为这两个整数常量有一个完美匹配的目标。缺少编译器只能找到两个方法,作为第一个参数一个整数,但它无法决定是否应该将第二个参数转换为字节或短

标签: c# overloading ambiguous overload-resolution


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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;
        }
    }
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不正确 -- C# 非常清楚这两种文字都是整数。
      • @JeroenVannevel 是的,它知道两者都是 INT。但是没有具有 (int, int) 签名的函数,因此编译器尝试隐式转换其中一个值。因为两者都可能被转换为简短的 C# 不知道调用哪个。
      猜你喜欢
      • 2011-06-08
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多