我有多个重载方法。但我不能称之为正确的。如何告诉编译器我特别需要"这种方法"被称为"有这些参数"?
顽皮的方法是第二个:
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
我怎样才能做到这一点?
答案 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");
时,事情可能变得不那么明显,而且这些错误可能很微妙,即使编译器没有抱怨也可能会得到错误的结果。