IEnumerable<T>
IList<T>
ICollection<T>
IEnumerable
IList
ICollection
针对这些接口的扩展出现了一个问题:
同时为上述接口扩展了一个 Add(this ? list) 方法,但是调用的时候,无法确认到底哪个?
摘自《C#语言规范4.0》第7.5.3.2节:
7.5.3.2 更好的函数成员
为确定更好的函数成员,构造一个精炼的实参列表 A,其中只包含实参表达式本身,采用其出现在原始实参列表中的顺序。
每个候选函数成员的形参列表按以下方式构造:
- 如果函数成员只以展开形式适用,则使用展开形式。
- 从形参列表中移除没有对应实参的可选形参。
- 对形参重新排序,从而使其出现在与实参列表中的对应实参相同的位置上。
给定一个带有实参表达式集 { E1, E2, ..., EN } 的实参列表 A 和带有形参类型 { P1, P2, ..., PN } 和 { Q1, Q2, ..., QN } 的两个适用的函数成员 MP 和 MQ,则在以下情形中,MP 将定义为比 MQ 更好的函数成员
- 对于每个实参,从 EX 到 QX 的隐式转换不如从 EX 到 PX 的隐式转换好,并且
- 对于至少一个参数,从 EX 到 PX 的转换比从 EX 到 QX 的转换更好。
当执行此计算时,如果MP或 MQ以展开形式适用,则 PX或 QX所代表的是展开形式的参数列表中的参数。
在形参类型序列 {P1, P2, …, PN} 和 {Q1, Q2, …, QN} 等效(即每个 Pi 都有到对应 Qi 的标识转换)的情况下,将应用以下附加规则来确定更好的函数成员。
- 如果 MP 是非泛型方法而MQ 是泛型方法,则MP 比MQ 好。
- 否则,如果 MP 在正常形式下适用,MQ 有一个 params 数组并且仅在其展开形式下适用,则 MP 比 MQ 好。
- 否则,如果 MP 具有比 MQ 更多的已声明形参,则 MP 比 MQ 好。如果两个方法都有 params 数组,并且都仅在其展开形式下适用,就可能出现这种情况。
- 否则,如果 MP 的所有形参都有对应实参,而需要使用默认实参替换 MQ 中的至少一个可选形参,则 MP 比 MQ 好。
- 否则,如果 MP 具有比 MQ 更明确的形参类型,则 MP 比 MQ 好。假设 {R1, R2, …, RN} 和 {R1, R2, …, RN} 表示 MP 和 MQ 的未实例化和未展开的形参类型。如果对于每个形参,RX 都不比 SX 更不明确,并且至少对于一个形参,RX 比 SX 更明确,则 MP 的形参类型比 MQ 的形参类型更明确:
- 类型形参不如非类型形参明确。
- 递归地,如果某个构造类型至少有一个类型实参更明确,并且没有类型实参比另一个构造类型(两者具有相同数目的类型实参)中的对应类型实参更不明确,则某个构造类型比另一个构造类型更明确。
- 如果一个数组类型的元素类型比另一个数组类型的元素类型更明确,则第一个数组类型比第二个数组类型(具有相同的维数)更明确。
- 否则,如果一个成员是非提升运算符而另一个是提升运算符,则非提升运算符更佳。
否则,两个函数成员都不是更好的。
加个new 关键字试试