Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显式使用扩展方法_C#_Extension Methods - Fatal编程技术网

C# 显式使用扩展方法

C# 显式使用扩展方法,c#,extension-methods,C#,Extension Methods,我有一个列表,希望以相反的顺序返回值。我不想的是颠倒列表本身 这看起来一点问题都没有,因为有一个Reverse()扩展方法用于IEnumerable,它完全符合我的要求 我的问题是,List还有一个Reverse()方法,它将列表本身反转并返回void 我知道有很多方法可以按相反的顺序遍历列表,但我的问题是: 如何告诉编译器我要使用同名的扩展方法? var list = new List<int>(new [] {1, 2, 3}); DumpList(list.Reverse())

我有一个
列表
,希望以相反的顺序返回值。我不想的是颠倒列表本身

这看起来一点问题都没有,因为有一个
Reverse()
扩展方法用于
IEnumerable
,它完全符合我的要求

我的问题是,
List
还有一个
Reverse()
方法,它将列表本身反转并返回void

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

如何告诉编译器我要使用同名的扩展方法?

var list = new List<int>(new [] {1, 2, 3});
DumpList(list.Reverse());                   // error
var list=newlist(new[]{1,2,3});
转储列表(list.Reverse());//错误
var list=新列表(新[]{1,2,3});
转储列表((作为IEnumerable.Reverse()列出);

IEnumerable list=new list(new[]{1,2,3});
转储列表(list.Reverse());

如果您不介意它的丑陋,并且编写了扩展方法,那么您可以随时调用:

MyExtensions.Reverse(list);
它本质上仍然只是一种静态方法。昨天,当ReSharper发疯并决定重写一半的扩展方法作为对静态方法的调用时,我发现了这一点

至于使用IEnumerable vs.List,它看起来并没有那么简单。我的第一个想法是使用:

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

但这给了我一个编译器错误,John的答案对于IEnumerable/List是正确的。

您不必强制转换参数来选择正确的方法。。。您只需要更具体地了解该方法

List<int> list = new List<int>() {1, 2, 3};
DumpList(Enumerable.Reverse(list)); 
List List=newlist(){1,2,3};
转储列表(可枚举。反向(列表));

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

DumpList(Enumerable.Reverse(list));
这里提到的其他一些方法的问题是它们并不总是做你想做的事情。例如,按如下方式强制转换列表:

((IEnumerable)list).Reverse()
最终可能会调用完全不同的方法,具体取决于您导入的名称空间,或者调用代码的定义类型

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

这似乎可行

   var stuff = new List<int>();
   var list = Enumerable.Reverse(stuff);
var stuff=newlist();
变量列表=可枚举。反向(填充);

这是对我的问题的最佳答案,所以我要给它评分。除非您键入完整的名称空间和类的名称,否则这两种解决方案都有相同的潜在名称空间导入问题。所以两者都不是更好,这只是偏好的问题。这种情况不太可能发生(而且,正如你所说,你可以完全限定名称)。一般来说,扩展方法意味着重载,并且不如实例方法好。如果您试图抑制扩展方法重载解析,那么最好不要使用扩展方法语法。
((IEnumerable)list).Reverse()
   var stuff = new List<int>();
   var list = Enumerable.Reverse(stuff);