Технически вы не можете переопределить методы расширения, потому что они статические. Однако, если метод в вашем классе или интерфейсе имеет ту же сигнатуру, что и метод расширения, компилятор предпочтет метод класса или интерфейса перед методом расширения. Поэтому обычно следующая строка:
list.LastOrDefault()
... на самом деле будет скомпилировано как:
Enumerable.LastOrDefault(list);
Но в следующем коде:
public class LinkedList2<T> : LinkedList<T>{
public T LastOrDefault() {
return Last.Value;
}
}
...
var list = new LinkedList2<int>();
list.LastOrDefault();
На самом деле компилятор будет вызывать LinkedList2.LastOrDefault()
вместо Enumerable.LastOrDefault<T>(this IEnumerable<T>)
.
Поскольку LinkedList не имеет метода Last()
или LastOrDefault()
, вы в конечном итоге вызовете крайне неэффективный Enumerable.Last()