1. ホーム
  2. c#

[解決済み] 型 'System.Collections.Generic.List< >' を 'System.Collections.Generic.IList< >' に暗黙的に変換できない。

2022-01-28 03:27:51

質問

この投稿にはたくさんの重複する可能性があります。しかし、私はそれらのほとんどを試しましたが、残念ながら私のエラーはまだ残っています。 が発生します。

<ブロッククオート

エラーは: エラー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();
}

いくつかの投稿で、この問題を解決するために return MstDtl.AsEnumerable().ToList();

しかし、私の場合、それはまた動作しません(エラーが発生します)。

どうすればいいですか?

想定されること InvoiceMaster を派生させるか実装する。 InvoiceHD で、C# 4 と .NET 4 以上を使用している場合は、ジェネリック分散を使用すればよい。

return MstDtl.ToList<InvoiceHD>();

これは IEnumerable<InvoiceMaster>IEnumerable<InvoiceHD> なぜなら IEnumerable<T> コバリアント T .

もうひとつの解決策は、宣言の内容を変更することです。 MstDtl を使用して明示的な型付けを行います。

IEnumerable<InvoiceMaster> MstDtl = ...;

(ローカル変数が小文字で始まる、通常のC#の命名法に従うこともお勧めしますが、それはまた別の問題です)。