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

时间:2014-03-26 12:33:47

标签: 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...
}

当我尝试调用第一个方法时: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

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:8)

简而言之:编译器找到了一个完全匹配,所以它更喜欢(名为category的参数的那个)比更通用的那个(正如Lippert所说的那样:“ close更接近于“)。有关更一般性的讨论,请参阅his answer here on SO,了解有null值的重载解析。

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

Translate("Hello {0} {1}", new string[] { "Foo", "Bar" });

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

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

params

一般来说,我会完全避免这种超载。为这些函数使用不同的名称会好得多,因为当参数类型为Translate("Hello {0} {1}", (object)"Foo", "Bar"); 时,事情可能变得不那么明显,而且这些错误可能很微妙,即使编译器没有抱怨也可能会得到错误的结果。