首页 新闻 会员 周边

对 IEnumerable,ICollection,IList 等... 的扩展问题

0
[已解决问题] 解决于 2012-04-15 12:20

IEnumerable<T>

IList<T>

ICollection<T>

 

IEnumerable

IList

ICollection

 

针对这些接口的扩展出现了一个问题:

同时为上述接口扩展了一个 Add(this ? list) 方法,但是调用的时候,无法确认到底哪个?

 

loneys的主页 loneys | 初学一级 | 园豆:23
提问于:2012-04-04 23:57
< >
分享
最佳答案
0

摘自《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 的形参类型更明确:
  • 类型形参不如非类型形参明确。
  • 递归地,如果某个构造类型至少有一个类型实参更明确,并且没有类型实参比另一个构造类型(两者具有相同数目的类型实参)中的对应类型实参更不明确,则某个构造类型比另一个构造类型更明确。
  • 如果一个数组类型的元素类型比另一个数组类型的元素类型更明确,则第一个数组类型比第二个数组类型(具有相同的维数)更明确。
  • 否则,如果一个成员是非提升运算符而另一个是提升运算符,则非提升运算符更佳。

否则,两个函数成员都不是更好的。

奖励园豆:5
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-04-05 09:54
其他回答(1)
0

加个new 关键字试试

OOLi | 园豆:163 (初学一级) | 2012-04-05 09:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册