我确信我做的事情非常糟糕,但我最好问专家。
在第三行,我收到错误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)
我在这里缺少什么?
答案 0 :(得分:3)
因为你已经以不同的方式命名你的字段(也许它也有不同的类型,我不知道,因为我不知道类型c.AA
是什么),编译器为{{创建了不同的类型1}},所以你有2个匿名类,具有不同的字段(即使它们具有相同的类型,但它们的名称不同)并且它们彼此不兼容。
我不太了解VB.Net,但是这样的事情:
Dim Query = (From c In Db.web Select New With {.Amount = CInt(c.AA)}).ToList Dim v = New With {.Amount = 108} Query.Add(v)
应该解决问题,至少可以在v
中使用。
答案 1 :(得分:0)
匿名类型标识不仅基于成员的类型,还基于名称。所以这两个对象的类型不同,即使对于人眼而言,它们也具有“相同”的结构:
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#,当一切都匹配时,编译器确保保证程序集中的匿名类型标识。