【问题标题】:C# method overloading with params带参数的 C# 方法重载
【发布时间】:2011-12-07 08:54:46
【问题描述】:

请帮忙!

我做错了什么?

    static void f1(Color color, params float[] f)
    {
        System.Console.WriteLine("Here is f1 for float");
    }

    static void f1(Color color, params int[] f)
    {
        System.Console.WriteLine("Here is f1 for int");
    }

    static void Main()
    {
        f1(null,0);
    }

我无法调用f1(null,0); 我得到编译时错误。

假设我确实需要这些方法签名,如何克服这些人员?

编辑:至于 Compile-tme 错误 - ReSharper 抱怨:

无法解析方法 f1(null,int),候选为:

void f1(Syste.Drawing.Color, params[] float)

void f1(Syste.Drawing.Color, params[] int)

【问题讨论】:

  • 您可以尝试将0 显式转换为intfloat,但我刚刚在测试程序中尝试了您的代码,它编译得很好。这是因为0 被假定为一个 32 位整数,所以调用了两个方法中的第二个。你能发布你得到的编译错误,以便我们获得更多信息吗? 编辑:参考@meziantou 的回答 - 这可能就是您要找的。​​span>
  • @Yochai Timmer:很遗憾你不能对评论投反对票。首先,这不会回答问题。其次,params 是一种语法糖,它隐式地将逗号分隔的值列表(数量可能是 0...n)转换为数组,因此 Michael Z 的代码在这方面完全有效。在回答之前了解语言的详细信息。
  • @TomW 你是对的。在这篇文章之后我已经调查过了。忘记删除评论了。

标签: c# params overloading


【解决方案1】:

我认为问题在于您为 Color 传递了 null,这可能会扰乱函数,要么将其更改为 Color?(因为它是一个结构),要么传递一个有效的 Color 值

static void f1(Color? color, params float[] f)

static void f1(Color? color, params int[] f)

【讨论】:

    【解决方案2】:

    您不能传递 null 来代替结构参数,即示例中的 Color。问题不在于 params 参数。 一些有效的电话就像;

    f1(Color.Black, 0); // prints "Here is f1 for int"
    f1(Color.Black, 0f); //prints "Here is f1 for float"
    f1(Color.Black, 0, 5, 6, 7); // prints "Here is f1 for int"
    f1(Color.Black, 0, 5.4f, 6, 7); //prints "Here is f1 for float"
    

    【讨论】:

      【解决方案3】:

      如果颜色为System.Drawing.Color,则参数color 不能为空。如果您希望 color 可以为空,请使用 Color? 类型

      f1(Color.Black, 0) // works
      f1(null, 0) // Doesn't work
      

      【讨论】:

        【解决方案4】:

        您需要在 Color 参数中传递 System.Drawing.Color Object not null。

        【讨论】:

          【解决方案5】:

          首先,您不能对 Color 参数使用 null。 要使用这两种代码之一,请将此用于整数:

          f1(SystemColors.ActiveBorder, new int[]{0});
          

          或者这个用于浮动:

          f1(SystemColors.ActiveBorder, new float[]{0});
          

          你使用它的方式总是调用 int 版本。

          【讨论】:

          • 由于f1() 方法采用params 的第二个参数,因此您不需要将输入定义为数组。此外,0 被视为 32 位整数,因此将采用该方法的整数重载。指定 0f 将显式选择方法的浮点重载。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-13
          • 1970-01-01
          相关资源
          最近更新 更多