给定(非常简单的)代码。
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 是更具体的版本,就像编译器使用方法重载解析一样?