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

Yve*_*ves 4 c#

我有多个重载方法.但我不能称之为正确的.如何告诉编译器我特别想要"这个方法"被称为"有这个参数"?

顽皮的方法是第二个:

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...
}
Run Code Online (Sandbox Code Playgroud)

这里当我尝试调用第一个方法时: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
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Adr*_*tti 8

简而言之:编译器找到了一个完全匹配,所以它更适合(有一个名为参数的category那个)而不是更通用的一个(正如Lippert所说:" 更接近总是比远离更好 ").有关更一般性的讨论,请参阅此处的答案,了解有关使用null值的重载决策.

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

Translate("Hello {0} {1}", new string[] { "Foo", "Bar" });
Run Code Online (Sandbox Code Playgroud)

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

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

Translate("Hello {0} {1}", (object)"Foo", "Bar");
Run Code Online (Sandbox Code Playgroud)

一般来说,我会因此而避免这种过载.为这些函数使用不同的名称会好得多,因为当参数类型object变得不那么明显时,这些错误可能会很微妙,即使编译器没有抱怨也可能会得到错误的结果.

  • 我不敢相信我怎么不想使用`new string []`的东西...谢谢它的工作;) (2认同)