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