【问题标题】:Method overloading issue in c#c#中的方法重载问题
【发布时间】:2011-07-30 14:27:21
【问题描述】:

在一次采访中,他们曾问过这样一个问题 一共有三种重载方法

public int Addtoatal(int a, int b)
public int Addtoatal(int a, int b, int c)
public float Addtoatal(float a, float b)

有什么方法我可以写下一个方法,我可以将一个 int 或 float 作为参数发送给该方法,我们真的可以在 OOPS 中做任何这样的事情

任何帮助都会很棒

谢谢

【问题讨论】:

    标签: c#-2.0


    【解决方案1】:

    是的,使用泛型:

    public T Addtoatal<T>(T a, T b) {}
    

    如果方法需要使用任何操作符(+,-,*)等会出现问题,因为泛型类型不能保证类 T 有操作符(操作符不能在接口中声明,因此你不能做一个匹配的约束)。
    在 .Net 4.0 中,您可以使用动态类型来获取动态变量以包含结果并将其添加到其中:

    public T Addtoatal<T>(T a, T b) {
       dynamic res = a;
       a += b;
       return res;
    }
    

    在其他 .Net 版本中,您需要像 MiscUtils 中的 Operator 类这样的解决方法:generic method to add int, float, in c#


    具有三个参数的第二个示例需要具有不同的签名(在 .Net 2.0 中),因为它具有更多参数。

    在 .Net 4.0 中,您可以只对泛型类型使用可选参数,但不能对值类型使用:

    public T Addtoatal<T>(T a, T b, T c = null) where T: class { //Do stuff }
    

    但是您可以使用可空类型的装箱,这适用于 int 和 double:

    public T Addtoatal<T>(T? a, T? b, T? c = null) where T : struct { //Do stuff, use .Value }
    

    如果您不想使用泛型,现在您可以做的下一个最好的事情是将单个方法声明为双精度(C# 4.0,因为可选参数):

    public double Addtoatal(double  a, double  b, double c = 0) {}
    

    在本例中,int 值无论如何都会转换为 double,因此不会丢失数据,并且 int 可以隐式转换为 double,但返回值需要显式转换为 int。

    【讨论】:

    • @happysmile :稍微修正了答案,我对使用泛型值类型的可选参数有点错误。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      您可以使用泛型类型来执行此操作,并且对于不同参数的可能性,您可以使用 params 参考,您想要传递的参数计数无关紧要。

          private T Addtoatal<T>(params T[] items)
          {
              dynamic total = 0;
              foreach (dynamic item in items)
              {
                  total += item;
              }
              return total;
          }
      

      用法;

      var total = Addtoatal<float>(1, 2, 3, 4, 5, 6);
      var total = Addtoatal<int>(1, 2, 3);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多