无法将类型“System.Collections.Generic.List< >”隐式转换为“System.Collec

本文关键字:System Collec 转换 List 类型 Collections Generic | 更新日期: 2023-09-27 18:27:20

这篇文章有很多可能的重复。但是我尝试了其中的大多数,不幸的是我的错误仍然发生。

错误

是:错误 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((;

但就我而言,它也不起作用(出现错误(

无法将类型“System.Collections.Generic.List< >”隐式转换为“System.Collec

假设InvoiceMaster派生自或实现InvoiceHD,并且您使用的是 C# 4 和 .NET 4 或更高版本,则可以只使用泛型差异:

return MstDtl.ToList<InvoiceHD>();

这利用了IEnumerable<InvoiceMaster>IEnumerable<InvoiceHD>的事实,因为IEnumerable<T>T中是协变的。

解决该问题的另一种方法是将MstDtl声明更改为使用显式类型:

IEnumerable<InvoiceMaster> MstDtl = ...;

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

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

您返回了错误的类型

如果 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)