无法隐式转换类型'System.Collections.Generic.List< >”到'System.Collections.Generic.IList< >”

时间:2014-10-22 06:14:18

标签: c# linq

这篇文章有很多可能的重复。但是我尝试了大部分主题,不幸的是我的错误仍然存​​在 发生的情况。

  

错误是:错误1无法将类型'System.Collections.Generic.List<Report.Business.ViewModels.InvoiceMaster>'隐式转换为'System.Collections.Generic.IList<ICSNew.Data.InvoiceHD>'。存在显式转换(您是否错过了演员?)

public IList<InvoiceHD> GetAllInvoiceMasterDetailsByInvoiceId(int InvoiceId)
{
    var dbMstDtl = ireportrepository.GetAllInvoiceMasterDetailsByInvoiceId(InvoiceId);

    var MstDtl = from mst in dbMstDtl 
                 select new Report.Business.ViewModels.InvoiceMaster 
                 {
                     ModifiedDate = mst.ModifiedDate,
                     SubTotal = Convert.ToDecimal(mst.SubTotal),
                     TotalDiscount = Convert.ToDecimal(mst.TotalDiscount),
                     VAT = Convert.ToDecimal(mst.VAT),
                     NBT = Convert.ToDecimal(mst.NBT),
                     AmtAfterDiscount = Convert.ToDecimal(mst.AmtAfterDiscount)
                 };

    return MstDtl.ToList();
}

在某些帖子中,当他们使用返回MstDtl.AsEnumerable()。ToList();

时,我发现这个问题已经解决了。

但在我的情况下,它也无法正常工作(获得错误)

3 个答案:

答案 0 :(得分:11)

假设InvoiceMaster派生或实施InvoiceHD,并且您正在使用C#4和.NET 4或更高版本,则可以使用通用差异:

return MstDtl.ToList<InvoiceHD>();

这使用IEnumerable<InvoiceMaster>IEnumerable<InvoiceHD>的事实,因为IEnumerable<T>T协变

另一种解决方法是将MstDtl的声明更改为使用显式输入:

IEnumerable<InvoiceMaster> MstDtl = ...;

(我还建议遵循常规C#命名,其中局部变量以小写字母开头,但这是另一回事。)

答案 1 :(得分:2)

您输入的错误类型。您的方法签名表示您要返回InvoiceHD的集合,但实际上您正在返回InvoiceMaster

的集合

您输入的错误类型

答案 2 :(得分:1)

如果InvoiceHD是Report.Business.ViewModels.InvoiceMaster的子类型:

MstDtl.Cast<InvoiceHD>().ToList()

或者如果ICSNew.Data.InvoiceHD不是从Report.Business.ViewModels.InvoiceMaster派生的,那么您可以手动映射数据:

var MstDtl = from mst in dbMstDtl 
                 select new InvoiceHD //return InvoiceHD instead of Report.Business.ViewModels.InvoiceMaster
                 {
                     ModifiedDate = mst.ModifiedDate,
                     SubTotal = Convert.ToDecimal(mst.SubTotal),
                     TotalDiscount = Convert.ToDecimal(mst.TotalDiscount),
                     VAT = Convert.ToDecimal(mst.VAT),
                     NBT = Convert.ToDecimal(mst.NBT),
                     AmtAfterDiscount = Convert.ToDecimal(mst.AmtAfterDiscount)
                 }

或将函数的返回类型从InvoiceHD更改为

public IList<Report.Business.ViewModels.InvoiceMaster> GetAllInvoiceMasterDetailsByInvoiceId(int InvoiceId)