2014-10-22 4 views
0

Есть много возможных дубликатов для этого post.But я пытался большинство из них студентов, к сожалению, моя ошибка все еще случается.Не может неявно преобразовать тип «System.Collections.Generic.List < >» до «System.Collections.Generic.IList < >»

Ошибка: Ошибка 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().

Но в моем случае это тоже не работает (получает ошибку)

+0

есть вы пытались вернуть MstDtl как IList ' – vallabha

+0

Создав коллекцию' InvoiceMaster', ваша подпись должна быть 'public IList ...' –

+0

Как связаны InvoiceMaster и InvoiceHD? – thepirat000

ответ

6

Допуская InvoiceMaster происходит от или реализует InvoiceHD, и что вы используете C# 4 и .NET 4 или выше, вы можете просто использовать общую дисперсию:

return MstDtl.ToList<InvoiceHD>(); 

Это использует тот факт, что IEnumerable<InvoiceMaster> является IEnumerable<InvoiceHD>, потому что IEnumerable<T> является ковариант в T.

Другим способом решить было бы изменить декларацию MstDtl использовать явную типизацию:

IEnumerable<InvoiceMaster> MstDtl = ...; 

(я бы также предложить следующее регулярное C# нейминга, где локальные переменные начинаются с строчной буквой , но это другой вопрос)

+0

Теперь ошибка - ошибка 'System.Collections.Generic.IEnumerable ' не содержит определения для «ToList» и наилучшего метода перегрузки методом «System» .Linq.Enumerable.ToList (System.Collections.Generic.IEnumerable ) 'имеет некоторые недопустимые аргументы – TechGuy

+1

@TechGuy: Well * does * 'InvoiceMaster' происходит от' InvoiceHD'? Вы этого нам не сказали. –

+0

есть. InvoiceMaster получается из InvoiceHD – TechGuy

2

Вы возвращаете неправильный тип. Ваш метод подписи говорит, что вы возвращаете коллекцию InvoiceHD, но вы на самом деле возвращает коллекцию InvoiceMaster

Вы возвращаете неправильный тип

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) 
+0

Когда я использую это, произошла ошибка. Невозможно передать объект типа «Report.Business.ViewModels.InvoiceMaster» для ввода «ICSNew.Data.InvoiceHD». – TechGuy

Смежные вопросы

 Смежные вопросы