<anonymous type =“”>类型的值无法转换为<anonymous type =“”> </anonymous> </anonymous>

时间:2011-09-24 21:13:48

标签: vb.net linq anonymous-types

我确信我做的事情非常糟糕,但我最好问专家。

在第三行,我收到错误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)

我在这里缺少什么?

2 个答案:

答案 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.AAIntegerQueryv也不足以与类型兼容。

显然你的代码是从你真正的问题中提炼出来的,所以我不能确切地说你应该做什么,但是使用命名而不是匿名类型可以解决你的问题。

这是在VB.NET规范(例如版本9.0 here),第11.10.4节“匿名对象创建表达式”(我的重点)中记录的:

  

如果两个匿名类创建表达式在同一个中出现   方法并得到相同的结果形状 - 如果属性顺序,   属性名称和属性类型都匹配 - 他们都会参考   同一个匿名班。

     

注释

     

编译器可能会选择进一步统一匿名类型,例如在汇编级别,但目前无法依赖它。

与注释相反,我相信对于 C#,当一切都匹配时,编译器确保保证程序集中的匿名类型标识。