Явно используйте метод расширения - PullRequest
11 голосов
/ 12 июня 2009

У меня есть List<T> и я хочу вернуть значения в обратном порядке. Чего я не хочу, так это перевернуть сам список.

Кажется, это не проблема, поскольку для IEnumerable<T> существует метод расширения Reverse(), который делает именно то, что я хочу.

Моя проблема в том, что есть также метод Reverse() для List<T>, который переворачивает сам список и возвращает void.

Я знаю, что есть множество способов просмотреть список в обратном порядке, но мой вопрос:

Как мне сообщить компилятору, что я хочу использовать метод расширения с тем же именем?

var list = new List<int>(new [] {1, 2, 3});
DumpList(list.Reverse());                   // error

Ответы [ 5 ]

14 голосов
/ 12 июня 2009

Лучший способ явного связывания с конкретным методом расширения - вызывать его с использованием синтаксиса общего метода. В вашем случае вы бы сделали это следующим образом:

DumpList(Enumerable.Reverse(list));

Проблема некоторых других подходов, упомянутых здесь, заключается в том, что они не всегда будут делать то, что вы хотите. Например, приведение списка таким образом:

((IEnumerable)list).Reverse()

может в конечном итоге вызвать совершенно другой метод в зависимости от импортированных вами пространств имен или типа определяемого кода вызова.

Единственный способ быть на 100% уверенным, что вы привязываетесь к определенному методу расширения, - это использовать синтаксис общего метода.

9 голосов
/ 12 июня 2009
var list = new List<int>(new [] {1, 2, 3});
DumpList((list as IEnumerable<int>).Reverse());

OR

IEnumerable<int> list = new List<int>(new [] {1, 2, 3});
DumpList(list.Reverse());
2 голосов
/ 12 июня 2009

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

List<int> list = new List<int>() {1, 2, 3};
DumpList(Enumerable.Reverse(list)); 
1 голос
/ 12 июня 2009

Это похоже на работу

   var stuff = new List<int>();
   var list = Enumerable.Reverse(stuff);
0 голосов
/ 12 июня 2009

Если вы не возражаете против уродства и написали метод расширения, вы всегда можете вызвать:

MyExtensions.Reverse(list);

Это все еще просто статический метод в глубине души. Я понял это вчера, когда ReSharper сошел с ума и решил переписать половину моих методов расширения как вызовы статического метода.

Что касается использования IEnumerable против списка , то все не так просто. Моей первой мыслью было бы использовать:

IEnumerable<T>.Reverse<T>(list);

Но это дает мне ошибку компилятора, и ответ Джона верен для IEnumerable / List.

...