【问题标题】:C# function with variable number of arguments causes confusion when multiple overloads available当多个重载可用时,具有可变数量参数的 C# 函数会导致混淆
【发布时间】:2016-07-05 12:34:34
【问题描述】:
    public string GetErrorMessage(params object[] args)
    {
        return GetErrorMessage("{0} must be less than {1}", args);
    }

    public string GetErrorMessage(string message, params object[] args)
    {
        return String.Format(message, args);
    }

电话来了

    Console.WriteLine(GetErrorMessage("Ticket Count", 5));

输出

Ticket Count

这意味着,它使用 2 个参数调用方法的第二次重载:消息、可变数量的对象参数。

有没有办法强制它调用第一个重载而不是第二个?

【问题讨论】:

  • 没有。第二个重载是更好的匹配,也是首选,因为它避免了创建参数数组的开销。除非您想要在可能的情况下调用第二个,否则为什么要同时提供这两个?
  • 这个有默认的错误信息,方便消费者使用。我无法摆脱任何东西,因为两者都是要被调用的。
  • 好吧,您显示的错误消息只有两个占位符,那么为什么不将便利声明更改为只接受两个参数呢?如果你愿意,可以让他们输入object,或者使用通用方法。
  • 对于其他特定的验证,参数的数量可能会达到 3 以进行名称、最小值和最大值的范围验证。当我们想说必须输入任何这些属性时,数字可能会超出的组验证。而且,这只是代码的提取简化版本,因此您可能无法看到复杂性。

标签: c# overloading params-keyword


【解决方案1】:

您看到的问题是因为您的方法调用中的第一项是string,因此将始终匹配第二个方法调用。您可以执行以下操作之一来解决此问题:

如果 args 的顺序不重要,您可以简单地确保第一项不是 string

this.GetErrorMessage(5, "Ticket Count");

或者您可以将string 转换为object

this.GetErrorMessage((object)"Ticket Count", 5);

您总是可以进行此调用,但它确实破坏了使用params 的全部目的:

this.GetErrorMessage(new object[] {"Ticket Count", 5 });

【讨论】:

    【解决方案2】:
    Console.WriteLine(GetErrorMessage(new object[] { "Ticket Count", 5 }));
    

    【讨论】:

    • 不知道为什么考虑到这一点的否决直接回答了“有没有办法强制它调用第一个重载而不是第二个?”
    • 这个答案是正确的。我已经检查过了。不过我觉得还是给个解释比较好。
    【解决方案3】:

    不,对于您所描述的情况,没有办法充分利用 params 关键字。由于提供了字符串参数,编译器会在重载解析期间看到更具体、更好的拟合。因此,将其强制转换为第一种形式的唯一方法是显式地将字符串强制转换为object []。像这样的:

    Console.WriteLine(GetErrorMessage(new object[] { "Ticket Count", 5 }));
    

    【讨论】:

    • 如果将第一个 string 转换为 object,则可以利用 params 关键字。不理想,但如果需要,它仍然允许使用params
    猜你喜欢
    • 2013-03-20
    • 2019-08-19
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多