C # - перегруженные методы расширения - PullRequest
0 голосов
/ 16 ноября 2010

В довольно простом учебном упражнении я использовал LinkedList, и когда мне нужно было вернуть последний элемент, я по ошибке использовал метод Last () вместо свойства Last, а затем я начал задаваться вопросом.

Этот методметод расширения IEnumerable, поэтому, если он не перегружен (Visual Studio + Resharper отображает базовую сигнатуру метода расширения IEnumerable для этого метода), это было бы очень неэффективно.

Страница LinkedList MSDN определяет большинство методов расширения как «перегруженные».но я не уверен, что это значит (щелкнув ссылку метода, вы увидите объяснение основного метода) и почему Visual Studio + Resharper не показывает его мне.

Спасибо.

Ответы [ 2 ]

7 голосов
/ 16 ноября 2010

Легкая ошибка - путать загрузку с ездой .Когда на странице MSDN говорится, что методы перегружены, это означает, что существует несколько версий методов с разными параметрами.

Вы не можете переопределить методы расширения, поскольку они являются статическими.

2 голосов
/ 16 ноября 2010

Технически вы не можете переопределить методы расширения, потому что они статические. Однако, если метод в вашем классе или интерфейсе имеет ту же сигнатуру, что и метод расширения, компилятор предпочтет метод класса или интерфейса перед методом расширения. Поэтому обычно следующая строка:

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()

...