【发布时间】:2013-05-29 16:09:05
【问题描述】:
鉴于(非常简单的)代码。
public class Class1
{
}
public class Class2 : Class1
{
}
public class List1 : System.Collections.Generic.IEnumerable<Class1>
{
public new System.Collections.Generic.IEnumerator<Class1> GetEnumerator()
{
yield return new Class1();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
public class List2 : List1 , System.Collections.Generic.IEnumerable<Class2>
{
public new System.Collections.Generic.IEnumerator<Class2> GetEnumerator()
{
yield return new Class2();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
然后是代码
var l = new List2();
var first = l.First();
不会编译,但会报错
“List2”不包含“First”的定义,并且找不到接受“List2”类型的第一个参数的扩展方法“First”(您是否缺少 using 指令或程序集引用?)
如果 List2 不是从 List1 派生的,那么它编译成功,这证明 List2 确实有一个有效的扩展方法。
这只是一个误导性错误的情况,问题是它有两个很多扩展方法,不知道选择哪个?
如果是这样,为什么它不能告诉 Class2 是更具体的版本,就像编译器使用方法重载解析一样?
【问题讨论】:
-
你当然有
using System.Linq;,对吧? -
是的。 (否则当 List2 不是从 List1 派生时它不会编译)。
标签: c# generics extension-methods