C# 无法使用正确的参数映射调用方法

C# 无法使用正确的参数映射调用方法,c#,C#,我有多个重载方法。但我找不到合适的。如何告诉编译器我特别希望“THIS METHOD”被“THIS PARAMETERS”调用 顽皮的方法是第二种: public string Translate(string text, params object[] args) { // Blah blah blah... } public string Translate(string text, string category, params object[] args) { // H

我有多个重载方法。但我找不到合适的。如何告诉编译器我特别希望“THIS METHOD”被“THIS PARAMETERS”调用

顽皮的方法是第二种:

public string Translate(string text, params object[] args)
{
    // Blah blah blah...
}

public string Translate(string text, string category, params object[] args)
{
    // Here we do some blah blah blah again...
}
这里,当我尝试调用第一个方法时,像这样:
Translate(“Hello{0}{1}”,“Foo”,“Bar”)编译器假定我正在调用第二个方法,并将参数设置为
category=“Foo”
args=“Bar”

我试图在调用参数时命名它们,但它给了我一些编译器错误

Translate("Hello {0} {1}", args: "Foo", "Bar"); // CS1738
Translate("Hello {0} {1}", args: "Foo", args: "Bar"); // CS1740

我怎样才能做到这一点呢?

简而言之:编译器找到了一个精确的匹配项,因此它(带有名为
category
的参数的那个)比更一般的匹配项(正如Lippert所说:“越近越好,越远越好”)。有关更一般性的讨论,请参阅关于使用
null
值的重载解析

您可以传递数组(而不是单个值),如:

这将匹配第一个重载,因为
string[]
不是
string
(然后第二个重载不适用),编译器会自动将数组转换为
params
参数(如果类型匹配)

作为替代方案,您可以将第二个参数转换为不完全匹配的参数(然后将使用更通用的版本):


一般来说,正是出于这个原因,我会避免这种重载。最好为该函数使用不同的名称,因为当参数类型为
object
时,事情可能会变得不那么明显,这样的错误可能很微妙,即使编译器没有抱怨,您也可能会得到错误的结果。

“Foo”是一个字符串,它与第二个参数
类别
完全匹配。传递一个params数组应该就可以了。是的,修复起来很容易,但根本问题是签名的选择。这是一根会一直刺下去的刺。在这个地方,重载是一个坏主意,使用不同的名称是更好的方法。需要注意的是:如果必须从一些重载版本中调用一个特定的方法,也许你应该重新考虑重载方法。我真不敢相信我怎么会不想使用
新字符串[]
东西。。。谢谢,成功了;)
Translate("Hello {0} {1}", new string[] { "Foo", "Bar" });
Translate("Hello {0} {1}", (object)"Foo", "Bar");