(非常に単純な)コードが与えられています。拡張メソッドがありません派生クラスの 'First'
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は、」「ファースト」「まず」の定義なし拡張メソッドが含まれていません'List2'型の最初の引数を受け入れることができます(使用するディレクティブまたはアセンブリ参照がありませんか?)
List2がList1から派生していない場合、List2は有効な拡張メソッドを持っていることを証明するokをコンパイルします。
これは単に誤解を招くエラーの場合で、2つの拡張メソッドがあり、どちらを選択するのかわからないという問題がありますか?
もしそうなら、コンパイラがメソッドのオーバーロード解決で使用するのと同じ方法で、Class2がより具体的なバージョンであると伝えられないのはなぜですか?
もちろん、「using System.Linq;」はありますか? –
はい。 (そうでなければ、List2がList1から派生していないときはコンパイルされません)。 – sgmoore