具有可变数量参数的C#函数在多个可用重载时会导致混淆

时间:2016-07-05 12:34:35

标签: c# overloading params-keyword

    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个参数调用方法的第二个重载:message,可变数量的对象参数。

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

您遇到的问题是由于方法调用中的第一项是string而导致的,因此总是匹配第二个方法调用。您可以执行以下操作之一来解决问题:

如果参数的顺序不重要,您只需确保第一项不是string

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

或者您可以将string投射到object

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

您可以随时拨打此电话,但它确实打破了使用params的全部目的:

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

答案 2 :(得分:2)

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

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