当有多个重载可用时,具有可变数量参数的 C# 函数会导致混淆
C# function with variable number of arguments causes confusion when multiple overloads available
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 个参数调用方法的第二次重载:消息、可变数量的对象参数。
有没有办法强制它调用第一个重载而不是第二个重载?
Console.WriteLine(GetErrorMessage(new object[] { "Ticket Count", 5 }));
您看到的问题是因为您的方法调用中的第一项是 string
,因此将始终匹配第二个方法调用。您可以执行以下操作之一来解决此问题:
如果参数的顺序不重要,您只需确保第一项不是 string
:
this.GetErrorMessage(5, "Ticket Count");
或者您可以将 string
转换为 object
:
this.GetErrorMessage((object)"Ticket Count", 5);
您可以随时进行此调用,但它确实破坏了使用 params
:
的全部目的
this.GetErrorMessage(new object[] {"Ticket Count", 5 });
不,对于您所描述的情况,无法充分利用 params
关键字。由于提供了字符串参数,编译器在重载解析过程中看到了更具体、更适合的情况。所以强制它变成第一种形式的唯一方法是明确地强制字符串变成 object []
。像这样:
Console.WriteLine(GetErrorMessage(new object[] { "Ticket Count", 5 }));
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 个参数调用方法的第二次重载:消息、可变数量的对象参数。
有没有办法强制它调用第一个重载而不是第二个重载?
Console.WriteLine(GetErrorMessage(new object[] { "Ticket Count", 5 }));
您看到的问题是因为您的方法调用中的第一项是 string
,因此将始终匹配第二个方法调用。您可以执行以下操作之一来解决此问题:
如果参数的顺序不重要,您只需确保第一项不是 string
:
this.GetErrorMessage(5, "Ticket Count");
或者您可以将 string
转换为 object
:
this.GetErrorMessage((object)"Ticket Count", 5);
您可以随时进行此调用,但它确实破坏了使用 params
:
this.GetErrorMessage(new object[] {"Ticket Count", 5 });
不,对于您所描述的情况,无法充分利用 params
关键字。由于提供了字符串参数,编译器在重载解析过程中看到了更具体、更适合的情况。所以强制它变成第一种形式的唯一方法是明确地强制字符串变成 object []
。像这样:
Console.WriteLine(GetErrorMessage(new object[] { "Ticket Count", 5 }));