Explicitly use extension method

删除回忆录丶 提交于 2019-12-23 07:09:03

问题


I'm having a List<T> and want get the values back in reverse order. What I don't want is to reverse the list itself.

This seems like no problem at all since there's a Reverse() extension method for IEnumerable<T> which does exactly what I want.

My problem is, that there's also a Reverse() method for List<T> which reverses the list itself and returns void.

I know there are plenty of ways to traverse the list in reverse order but my question is:

How do I tell the compiler that I want to use the extension method with the same name?

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

回答1:


The best way to explictly bind to a particular extension method is to call it using shared method syntax. In your case, you would do that like:

DumpList(Enumerable.Reverse(list));

The problem with some of the other approaches mentioned here is that they won't always do what you want. For example, casting the list like so:

((IEnumerable)list).Reverse()

could end up calling a completely different method depending on the namespaces you have imported, or what type the calling code is defined in.

The only way to be 100% sure you bind to a particular extension method is to use the shared method syntax.




回答2:


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



回答3:


You don't have to cast the parameter to get the right method selected... you just need to be more specific about the method.

List<int> list = new List<int>() {1, 2, 3};
DumpList(Enumerable.Reverse(list)); 



回答4:


This seems to work

   var stuff = new List<int>();
   var list = Enumerable.Reverse(stuff);



回答5:


If you don't mind the ugliness, and you wrote the extension method, you can always call:

MyExtensions.Reverse(list);

It's still just a static method at heart. I figured this out yesterday when ReSharper went nuts and decided to rewrite half of my extension methods as calls to the static method.

As far as using the IEnumerable<T> vs. List<T>, it doesn't appear that simple. My first thought would be to use:

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

But that's giving me a compiler error, and John's answer is correct for IEnumerable/List.



来源:https://stackoverflow.com/questions/987541/explicitly-use-extension-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!