代码之家  ›  专栏  ›  技术社区  ›  VVS

显式使用扩展方法

  •  10
  • VVS  · 技术社区  · 16 年前

    List<T> 并希望以相反的顺序返回值。我不想的是颠倒列表本身。

    这看起来一点问题都没有,因为有一个 Reverse() IEnumerable<T> 这正是我想要的。

    我的问题是,还有一个 反向 方法 列表<T> 它会反转列表本身并返回void。

    我知道有 大量

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

    var list = new List<int>(new [] {1, 2, 3});
    DumpList(list.Reverse());                   // error
    
    5 回复  |  直到 16 年前
        1
  •  16
  •   VVS    16 年前

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

    DumpList(Enumerable.Reverse(list));
    

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

    ((IEnumerable)list).Reverse()
    

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

        2
  •  9
  •   VVS    16 年前
    var list = new List<int>(new [] {1, 2, 3});
    DumpList((list as IEnumerable<int>).Reverse());
    

    IEnumerable<int> list = new List<int>(new [] {1, 2, 3});
    DumpList(list.Reverse());
    
        3
  •  2
  •   Amy B    16 年前

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

    List<int> list = new List<int>() {1, 2, 3};
    DumpList(Enumerable.Reverse(list)); 
    
        4
  •  1
  •   Dan Blair    16 年前

    这似乎有效

       var stuff = new List<int>();
       var list = Enumerable.Reverse(stuff);
    
        5
  •  0
  •   Chris Doggett    16 年前

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

    MyExtensions.Reverse(list);
    

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

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

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

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