【问题标题】:Function Overloading函数重载
【发布时间】:2010-04-16 07:48:47
【问题描述】:

假设我定义了这三个方法:

int F1(int, int);
int F1(float, float);
Float F1(int, int);

我在这里调用方法 F1:

Console.writeline(F1(5,6).ToString()));

它将调用哪个方法以及为什么?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    第一个和第三个函数不会在同一个命名空间中编译。

    这是因为函数签名根据参数的类型和数量来区分,并且它们是相同的。返回类型不被视为方法签名的一部分。

    如果您在名称空间中只有第一个和第二个(或第二个和第三个),则将调用最合适的一个(传入整数类型的那个,就像您传入整数一样)。

    Eric Lippert 在blog entries 中谈到了 C# 的精妙之处。

    【讨论】:

      【解决方案2】:
      class Program
      {
          static void Main(string[] args)
          {
      
              Add(3, 4,3);
          }
          public static void Add(int FN, int SN)
          {
              Console.WriteLine("Total is {0}", FN + SN);
          }
          public static void Add(int FN, int SN, int TN)
          {
              Console.WriteLine("Total is {0}", FN + SN + TN); 
          }
      }
      

      方法重载和函数重载术语可以互换使用。方法重载允许一个类有多个同名的方法。但有不同的签名。 C# 函数可以根据参数的数量、类型(int、float 等)和种类(Value、ref 或 out)进行重载。 方法的签名不包括返回类型和参数修饰符。因此,不能根据返回类型和参数修饰符重载函数。

      【讨论】:

      • 方法的名称是方法签名的一部分,因此“方法重载允许一个类具有多个同名的方法。但具有不同的签名”的定义并不完全正确!也许我们说得更好:方法重载是实现两个或多个同名但在一个类中参数的数量、类型、顺序和种类(ref/out/value)不同的方法
      【解决方案3】:

      编译错误,因为在您的程序中使用了两次相同的函数签名!

      int F1(int, int); 
      
      Float F1(int, int); 
      

      函数签名是 (函数名称 + 参数数量 + 每个参数的类型) 这在你的情况下是一样的......

      【讨论】:

        【解决方案4】:

        你试过了吗?

        你会认为它应该执行:

        int F1(int, int);
        

        Float F1(int, int);
        

        然而,函数重载对返回值不起作用——参数类型必须是唯一的,所以这甚至无法编译。

        【讨论】:

          【解决方案5】:

          在 C# 中,它是 参数 重载,而不是函数重载。您可以更改方法的输入参数,这可能会导致不同的返回类型,但您不能指定不同的返回类型来区分您的方法。

          【讨论】:

            【解决方案6】:

            在函数重载中,函数的名称相同,但参数类型或参数数量不同。

            在函数重载中不考虑函数的返回类型。

            所以这段代码甚至无法编译。因为你不能在一个命名空间中编写完全相同的函数。

            【讨论】:

              猜你喜欢
              • 2014-06-18
              • 2012-03-09
              • 1970-01-01
              • 2023-03-24
              • 2017-08-06
              • 2018-03-05
              • 2020-03-23
              相关资源
              最近更新 更多