Biorąc pod uwagę (bardzo uproszczony) kod.Brak metody rozszerzenia "Pierwszy" w klasie pochodnej
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();
}
}
Następnie kod
var l = new List2();
var first = l.First();
nie skompilować, ale daje błąd
'lista2' nie zawiera definicji 'First', a nie metoda rozszerzenie 'pierwsze' akceptowanie pierwszego argumentu typu "List2" można znaleźć (czy brakuje instrukcji użycia lub odniesienia do zespołu?)
Jeśli Lista2 nie jest wyprowadzona z Listy1, kompiluje się poprawnie, co dowodzi, że List2 ma poprawną metodę rozszerzenia.
Czy to po prostu przypadek błędnego błędu, a problem polega na tym, że ma dwie metody rozszerzenia i nie wie, który wybrać?
Jeśli tak, dlaczego nie można stwierdzić, że klasa 2 jest bardziej szczegółową wersją w taki sam sposób, w jaki używa kompilatora z metodą zabezpieczenia przed przeciążeniem?
Oczywiście masz 'using System.Linq;', prawda? –
Tak. (W przeciwnym razie nie skompiluje się, gdy List2 nie pochodzi z Listy1). – sgmoore