C# 无法使用正确的参数映射调用方法
我有多个重载方法。但我找不到合适的。如何告诉编译器我特别希望“THIS METHOD”被“THIS PARAMETERS”调用 顽皮的方法是第二种: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
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");