(非常に単純化された)コードが与えられます。
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 が有効な拡張メソッドを持っていることを証明します。
これは単なる誤解を招くエラーのケースであり、問題は 2 つの多くの拡張メソッドがあり、どちらを選択すればよいかわからないことですか?
もしそうなら、コンパイラがメソッドのオーバーロード解決で使用するのと同じ方法で、Class2 がより具体的なバージョンであると判断できないのはなぜですか?