【问题标题】:List not inheriting an IEnumerable extension method列表不继承 IEnumerable 扩展方法
【发布时间】:2013-07-01 22:08:43
【问题描述】:

我有以下代码创建IEnumerable<T> 的扩展:

//http://stackoverflow.com/a/1779135/1180926
public static IEnumerable<T> SkipLast<T>(this IEnumerable<T> source, int n)
{
  //.......
}

当我尝试将此应用于列表时:

public static void RemoveTwo(List<string> strList)
{
    strList = strList.SkipLast(2);
}

我收到以下错误:

无法将类型“System.Collections.Generic.IEnumerable”隐式转换为 'System.Collections.Generic.List'。显式转换 存在(您是否缺少演员表?)

但是List&lt;T&gt;继承了IEnumerable&lt;T&gt;src),那么它不应该也继承它的扩展方法吗?

【问题讨论】:

    标签: c# inheritance extension-methods


    【解决方案1】:

    你必须从IEnumerable&lt;string&gt;创建一个列表:

    public static void RemoveTwo(List<string> strList)
    {
        strList = strList.SkipLast(2).ToList();
    }
    

    您的扩展返回IEnumerable&lt;string&gt;,它不是List&lt;string&gt;。但是,如果要修改strList,则必须使用ListsRemove 的方法来修改原始集合,否则您必须返回新列表。

    如果您想更改原始集合而不返回新列表,则应使用 RemoveAt 而不是 SkipLast

    public static void RemoveTwo(List<string> strList)
    {
        if(strList.Count > 0)
            strList.RemoveAt(strList.Count-1);
        if(strList.Count > 0)
            strList.RemoveAt(strList.Count-1);
    }
    

    【讨论】:

      【解决方案2】:

      您做错了将 back 分配给列表 IEnumerable&lt;string&gt; 返回值。你不能这样做,因为即使所有List&lt;T&gt;s 也是IEnumerable&lt;T&gt;,反之不是正确的。您需要做的是在SkipLast 调用的末尾添加 ToList()

      public static List<string> RemoveTwo(List<string> strList)
      {
          return strList.SkipLast(2).ToList();
      }
      

      【讨论】:

      • 你又被新会员绊倒了:)。您的代码对原始列表没有任何作用,要使您的代码正常工作,您需要通过 ref 传递 strList。
      • 是的,您正在将其重新分配给局部变量 strList,但是不会修改传递给 RemoveTwo 函数的列表。您要么需要将列表作为ref 传入,以便在重新分配时更新原始列表,要么将您生成的新列表作为返回值返回。
      【解决方案3】:

      您的问题不在于调用扩展方法(按原样工作),而在于将其IEnumerable&lt;string&gt; 返回值分配给List&lt;string&gt; 变量。为了演示,以下代码 work 可以正常编译(但什么也不做):

      public static void RemoveTwo(List<string> strList)
      {
          strList.SkipLast(2);
      }
      

      【讨论】:

      • 编译但对列表没有任何作用,请查看 newstackexinst 上的 cmets。回答
      猜你喜欢
      • 2017-03-16
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      相关资源
      最近更新 更多