【问题标题】:Value of type <anonymous type> cannot be converted to <anonymous type><anonymous type> 类型的值不能转换为 <anonymous type>
【发布时间】:2011-09-24 21:13:48
【问题描述】:
我确定我做错了什么,但我最好问问专家。
在第三行我收到错误Value of type <anonymous type> cannot be converted to <anonymous type>
Dim Query = (From c In Db.web Select New With {.AA = c.AA}).ToList
Dim v = New With {.Amount = 108}
Query.Add(v)
我在这里错过了什么?
【问题讨论】:
标签:
vb.net
linq
anonymous-types
【解决方案1】:
因为你给你的字段命名不同(也许它也有不同的类型,我不知道,因为我不知道c.AA是什么类型),编译器为v创建了不同的类型,所以你有 2 个匿名类,具有不同的字段(即使它们具有相同的类型,但它们的名称不同)并且它们彼此不兼容。
我不太了解 VB.Net,但是类似这样:
Dim Query = (From c In Db.web Select New With {.Amount = CInt(c.AA)}).ToList
暗 v = 新的 {.Amount = 108}
查询.Add(v)
应该能解决问题,至少在C#工作。
【解决方案2】:
匿名类型标识不仅基于成员的类型,还基于它们的名称。所以这两个对象是不同类型的,尽管在人眼看来它们具有“相同”的结构:
Dim a = New With { .Name = "Bob" }
Dim b = New With { .Moniker = "Robert" }
因此,即使 c.AA 是 Integer,也不足以使 Query 和 v 类型兼容。
显然你的代码是从你的实际问题中提炼出来的,所以我不能确切地说你应该做什么,但也许使用命名而不是匿名类型可以解决你的问题。
这在 VB.NET 规范(例如版本 9.0 here)中记录,第 11.10.4 节“匿名对象创建表达式”(我的重点):
如果两个匿名类创建表达式出现在同一个
方法并产生相同的结果形状-如果属性顺序,
属性名称和属性类型都匹配——它们都将引用
同一个匿名类。
注释
编译器可能会选择进一步统一匿名类型,例如在程序集级别,但目前不能依赖这一点。
与注解相比,我相信对于C#,编译器确实在一切都匹配时保证整个程序集的匿名类型标识。