说我有以下方法:
public static void MyCoolMethod(params object[] allObjects)
{
}
public static void MyCoolMethod(object oneAlone, params object[] restOfTheObjects)
{
}
如果我这样做:
MyCoolMethod("Hi", "test");
哪一个被调用,为什么?
答案 0 :(得分:15)
测试很容易 - 第二种方法被调用。
至于为什么--C#语言规范有一些关于如何解决模糊函数声明的非常详细的规则。关于SO周围的接口,继承和重载有很多问题,以及为什么调用不同的重载的一些具体示例,但是要回答这个特定的实例:
C# Specification - Overload Resolution
7.5.3.2更好的职能成员
为了确定 更好的功能成员,a 精简参数列表A是 构造只包含 参数表达式本身就在 他们出现在原件中 参数列表。
每个的参数列表 候选职能成员是 以下列方式构建:
如果使用扩展表单 功能成员适用 仅限于扩展形式。
没有的可选参数 相应的参数被删除 来自参数列表
参数重新排序 这样它们就会发生在一起 作为相应论点的位置 在参数列表中。
进一步......
如果参数类型序列{P1,P2,...,PN}和{Q1,Q2,...,QN}是等效的> (即,每个Pi具有到相应Qi的身份转换),以下 按顺序应用打破平局规则,以确定更好的功能成员。
如果MP是非泛型方法且MQ是泛型方法,则MP优于MQ。
否则,如果MP适用于其正常形式且MQ具有params数组且是 仅适用于其扩展形式,则MP优于MQ。
否则,如果MP的声明参数多于MQ,则MP优于MQ。 如果两个方法都有params数组并且仅适用于它们,则会发生这种情况 扩展形式。
大胆的打破平局规则似乎适用于这种情况。该规范详细介绍了如何以正常形式和扩展形式处理params数组,但最终经验法则是根据参数的数量和类型调用最具体的重载。
答案 1 :(得分:6)
第二个,编译器将首先尝试解决显式声明的参数,然后再回到params集合上。
答案 2 :(得分:1)
这种重载很棘手......
MyCoolMethod(“嗨”,“测试”)显然会调用第二次重载,但是
MyCoolMethod( “你好”); 也调用第二个重载。我测试了这个。
因为两个输入都是对象,所以编译器假定传入的任何内容都是一个对象数组,并完全忽略第一个重载。
它可能与womp提到的Better函数成员分辨率有关 http://msdn.microsoft.com/en-us/library/aa691338(v=VS.71).aspx