解决方法:无法将system.collections.generic.list隐式转换为system.collections.generic.ienumerable

问题描述

我收到此错误

无法将System.Collections.Generic.List隐式转换为System.Collections.Generic.IEnumerable

当尝试使用列表在使用C#Razor构建的页面中扩展@Html.DropDownList()时。

一个名为SubProgram.cs的C#类,该类使用以下方法返回List<>

public List<SubProgram> SubProgramCodeDescriptionList()
{
    List<SubProgram> SubPrograms = new List<SubProgram>();

    // Get the list of SubPrograms for this AcctIII role_code from BudgetAcct3ToSubProgram  table 
    using (var db = Database.Open("dbnAME"))
    {
        string sql = @"
           SELECT l.SubProgramID,l.SubProgram + ' ' + l.SubProgramDesc AS SubProgramDesc
           FROM BARF_SubPrograms l
           WHERE l.Deleted = 0
           ORDER BY l.SubProgramDesc";

        var ListSubPrograms = db.Query(sql);

        foreach (var SubProgram in ListSubPrograms)
        {
            SubProgram item = new SubProgram ();
            item.SubProgramID = SubProgram.SubProgramID;
            item.SubProgramCodeDescr = SubProgram.SubProgramDesc;
            SubPrograms.Add(item);
        }

        db.Close();

        return SubPrograms;
    }
}

这里是SubProgram类,该方法是其中的一部分:

public class SubProgram 
{
    private int subprogramid;
    private string subprogramcode;
    private string subprogramcodedescr;

    public int SubProgramID 
    {
        get { return subprogramid; }
        set { subprogramid = value; }
    }

    public string SubProgramCode
    {
        get { return subprogramcode; }
        set { subprogramcode = value; }
    }

    public string SubProgramCodeDescr
    {
        get { return subprogramcodedescr; }
        set { subprogramcodedescr = value; }
    }
}

在Razor页面的C#部分中,我创建一个类型为SubProgram的对象来填充SubProgramList

// Create List Boxes variable need for this add
List<SubProgram> SubProgramIDdropdownlist = new List<SubProgram>();

// Create SubProgram object so the method can be called
SubProgram subProgram = new SubProgram();

// Pass object to method SubProgramIDdropdownlist to return all of the SubPrograms
SubProgramIDdropdownlist = subProgram.SubProgramCodeDescriptionList();

在上面的C#Razor部分下面的HTML页面的body部分中,我尝试使用上面的代码填充DropDownList:

      <label class="FieldLabels">"Search SubPrograms"</label>
            @Html.DropDownList("SubProgramCodes",SubProgramIDdropdownlist,new  {
                      @id = "Column1",@class = "EditTextBox",}
              )

在最后一部分中,错误发生在SubProgramIDdropdownlist上,这是我得到错误的地方

无法将System.Collections.Generic.List隐式转换为System.Collections.Generic.IEnumerable

还有其他相关文章,但不是来自类方法。请帮忙,我知道这可能需要使用强制转换,但是甚至不确定从哪里开始正确进行强制转换。

解决方法

我可以想到的两种方法:

  1. 在剃须刀页面上使用AsEnumerable

    @Html.DropDownList("SubProgramCodes",SubProgramIDdropdownlist.AsEnumarable(),new { @id = "Column1",@class = "EditTextBox"})

OR

  1. 将返回类型从List<SubProgram>更改为IEnumerable<SubProgram>

    public IEnumerable<SubProgram> SubProgramCodeDescriptionList(){...}

,

感谢tontonsevilla,您的回答对解决这一问题很有帮助。

我想出的最终解决方案是两个名称空间中都包含SelectListItem的两个名称空间之间存在冲突:System.Web.Mvc和System.Web.WebPages.Html。 由于我主要在此项目中使用Razor页面而不是MVC,因此我删除了Razor C#页面顶部的@using System.Web.Mvc,因为该错误明确表明在System.Web.Mvc和在System.Web.WebPages.Html中,我显然需要使用其中一个,但不能同时使用。我能够强制转换它们以使其正常工作,但是当我意识到这是名称冲突时,就不需要很多额外的代码。 使用这两个名称空间会在这两个名称空间之间产生冲突,因为SelectListItem似乎同时在两个名称空间中。