C#如何select含糊不清和参数

说我有以下方法:

public static void MyCoolMethod(params object[] allObjects) { } public static void MyCoolMethod(object oneAlone, params object[] restOfTheObjects) { } 

如果我这样做:

 MyCoolMethod("Hi", "test"); 

哪一个被调用,为什么?

这很容易testing – 第二个方法被调用。

至于为什么 – C#语言规范有一些关于如何解决模糊函数声明的非常详细的规则。 关于SO周围的接口,inheritance和重载有很多问题,并给出了为什么不同的重载被调用的一些具体例子,但是要回答这个特定的实例:

C#规范 – 重载parsing

7.5.3.2更好的function成员

为了确定更好的函数成员,构造一个精简的参数列表A,其中只包含参数expression式本身,它们按照出现在原始参数列表中的顺序排列。

每个候选函数成员的参数列表按以下方式构造:

  • 如果函数成员仅适用于展开forms,则使用展开forms。

  • 没有相应参数的可选参数将从参数列表中删除

  • 参数被重新sorting,以便它们出现在参数列表中相应参数的相同位置。

还有…

在参数types序列{P1,P2,…,PN}和{Q1,Q2,…,QN}是等价的情况下(即,每个Pi具有到相应的Qi的标识转换),应用下面的平局规则,以便确定更好的function成员。

  • 如果MP是非generics方法,MQ是generics方法,那么MP比MQ好。

  • 否则,如果MP以其正常forms适用且MQ具有params数组且仅适用于其扩展forms,则MP比MQ好。

  • 否则,如果MP具有比MQ更多的声明参数,则MP比MQ好。 如果两个方法都有params数组并且仅适用于其扩展forms,则会发生这种情况。

粗体打破规则似乎是在这种情况下应用的。 该规范详细讨论了params数组是如何在正常和扩展forms下处理的,但最终的经验法则是,最具体的重载将根据参数的数量和types来调用。

第二个,编译器将首先尝试解决显式声明的参数,然后回落到params集合上。

这个过载是棘手的…

MyCoolMethod(“你好”,“testing”)显然调用第二次重载,但是

MyCoolMethod( “你好”); 称为第二重载。 我testing了这个。

也许因为这两个input都是对象,编译器假设任何传入的对象都是一个对象数组,并且完全忽略了第一个重载。

这可能与womp提到的更好的函数成员分辨率有关http://msdn.microsoft.com/en-us/library/aa691338(v=VS.71).aspx