明确使用扩展方法

VVS*_*VVS 11 c# extension-methods

我有一个List<T>并希望以相反的顺序返回值.我不想要的是反转列表本身.

这似乎没有任何问题,因为有一个Reverse()扩展方法IEnumerable<T>正是我想要的.

我的问题是,还有一种Reverse()方法List<T>可以反转列表本身并返回void.

我知道有很多方法以相反的顺序遍历列表,但我的问题是:

如何告诉编译器我想使用具有相同名称的扩展方法?

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

Sco*_*ski 14

明确绑定到特定扩展方法的最佳方法是使用共享方法语法调用它.在你的情况下,你会这样做:

DumpList(Enumerable.Reverse(list));
Run Code Online (Sandbox Code Playgroud)

这里提到的一些其他方法的问题是它们不会总是做你想要的.例如,像这样强制转换列表:

((IEnumerable)list).Reverse()
Run Code Online (Sandbox Code Playgroud)

最终可能会调用一个完全不同的方法,具体取决于您导入的命名空间,或者定义调用代码的类型.

要100%确定绑定到特定扩展方法的唯一方法是使用共享方法语法.


Joh*_*her 9

var list = new List<int>(new [] {1, 2, 3});
DumpList((list as IEnumerable<int>).Reverse());
Run Code Online (Sandbox Code Playgroud)

要么

IEnumerable<int> list = new List<int>(new [] {1, 2, 3});
DumpList(list.Reverse());
Run Code Online (Sandbox Code Playgroud)