【问题标题】:Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Collections.Generic.List<AnonymousType#2>' [duplicate]无法将类型“System.Collections.Generic.List<AnonymousType#1>”隐式转换为“System.Collections.Generic.List<AnonymousType#2>”[重复]
【发布时间】:2014-05-12 09:19:31
【问题描述】:

我正面临一个编译时错误,例如

Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Collections.Generic.List<AnonymousType#2>'

这是我的代码:

var query = Enumerable.Repeat(new
            {
                        Id = default(int),
                        Name = string.Empty,
                        type_id = default(int),
                        Ownername = string.Empty,
                        Ownermob = string.Empty,
                        ContactPerson = string.Empty,
                        ContactPersonmob = string.Empty,
                        Phone = string.Empty,
                        Mobile = string.Empty,
                        Room = string.Empty,
                        Build = string.Empty,
                        Road = string.Empty,
                        Area = string.Empty,
                        City = string.Empty,
                        country_id = default(int?),
                        state_id = default(int?),
                        Email = string.Empty,
                        Remark = string.Empty,
                        UserOFC = default(bool),
                        UserVAT = default(bool),
                        UserINV = default(bool),
                        UserNone = default(bool),
                        Username = string.Empty,
                        Register_Date = default(DateTime)},0).ToList();

                    query = db.Parties.Where(p => p.type_id.Equals(GroupByENTYPE)).OrderByDescending(p => p.Register_Date).Select(p => new
                    {
                        Id = p.Id,
                        Name = p.Name,
                        type_id = p.type_id,
                        Ownername = p.Ownername,
                        Ownermob = p.Ownermob,
                        ContactPerson = p.ContactPerson,
                        ContactPersonmob = p.ContactPersonmob,
                        Phone = p.Phone,
                        Mobile = p.Mobile,
                        Room = p.Room,
                        Build = p.Build,
                        Road = p.Road,
                        Area = p.Area,
                        City = p.City,
                        country_id = p.country_id,
                        state_id = p.state_id,
                        Email = p.Email,
                        Remark = p.Remark,
                        UserOFC = p.UserOFC,
                        UserVAT = p.UserVAT,
                        UserINV = p.UserINV,
                        UserNone = p.UserNone,
                        Username = db.Users.Where(u => u.Ref_no.Equals(p.User_id)).Select(u => u.Username).FirstOrDefault(),
                        Register_Date = p.Register_Date
                    }).FilterForColumn(ColumnName, SearchText).ToList();//here error occurs
                }

这里用于声明公共查询部分并在多个条件下分配它。在 FilterColumn 部分面临编译时错误。如何在另一个页面上使用相同类型的此声明不会产生任何问题。

我在这里放置了提供知识的表模式:

---------------------已更新--------- -------------------

Id  int Unchecked
Name    varchar(50) Unchecked
type_id int Unchecked
Ownername   varchar(50) Checked
Ownermob    nchar(10)   Checked
Room    varchar(10) Checked
Build   varchar(50) Checked
Road    text    Checked
Area    text    Checked
City    varchar(50) Checked
Phone   nchar(10)   Checked
Mobile  nchar(10)   Checked
Email   varchar(100)    Checked
ContactPerson   varchar(50) Checked
ContactPersonmob    nchar(10)   Checked
UserOFC bit Checked
UserVAT bit Checked
UserINV bit Checked
UserNone    bit Checked
state_id    int Checked
country_id  int Checked
Remark  text    Checked
Register_Date   smalldatetime   Unchecked
User_id char(14)    Unchecked

请帮帮我...

【问题讨论】:

  • 我强烈怀疑您的某个属性类型不正确。如果不了解您的派对类型,我们无法判断。仔细查看每一个属性 - 或者一次删除一堆,直到你可以编译它。
  • 是的 char(14) 就像字符串一样
  • @JonSkeet 看看我更新的问题。
  • 如果你从生成的模型代码中指定CLR类型会更清楚,即p.Ownername的类型等等。毕竟,这就是编译器会关心的。
  • 好吧,我希望您自己查看每个属性。您可以将鼠标悬停在第二个查询中的每个属性上,并将其与您在 Enumerable.Range 调用中使用的类型进行比较...

标签: c# linq anonymous-types linq-expressions


【解决方案1】:

很难从纯文本中看出。尝试使用二进制搜索来查找不兼容的属性。那就是

  1. 注释掉后半部分属性以查看前半部分属性中是否发生不兼容。
  2. 如果编译器仍然报告错误,请对前半部分属性执行相同操作。
  3. 如果编译器不报告错误,则对后半部分属性执行相同操作。

【讨论】:

    【解决方案2】:

    你的匿名类型的属性看起来是一样的,所以我最好的猜测是,当你有一个对象要使用时,你的默认类型之一与实际使用的类型不同。

    我认为解决这个问题的最佳策略是使用 Null Object pattern


    资源:

    【讨论】:

    • 空对象模式在这里有什么帮助?
    • @sloth 他可以使用空对象而不是分配default(int) 和String.Empty,这将确保类型正确。我同意这不是经典用法,但比问题中的尝试更好。
    • 非常复杂的解决方案。
    • 你说的不是使用空对象,而是简单地使用常规类而不是匿名类型。
    • @sloth 不,我建议在第二个查询中使用一个空对象作为Party 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多