Vb.net 类型为的值无法转换为

Vb.net 类型为的值无法转换为,vb.net,linq,anonymous-types,Vb.net,Linq,Anonymous Types,我肯定我做错了什么,但我最好问问专家 在第三行,我得到类型为“无法转换为”的错误值 我在这里遗漏了什么?因为您对字段的命名不同,可能它也有不同的类型,我不知道,因为我不知道c.AA是什么类型,编译器为v创建了不同的类型,所以您有两个匿名类,具有不同的字段,即使它们具有相同的类型,但它们的名称不同,彼此不兼容 我对VB.Net不太了解,但大致如下: Dim Query = (From c In Db.web Select New With {.Amount = CInt(c.AA)}).ToLis

我肯定我做错了什么,但我最好问问专家

在第三行,我得到类型为“无法转换为”的错误值


我在这里遗漏了什么?

因为您对字段的命名不同,可能它也有不同的类型,我不知道,因为我不知道c.AA是什么类型,编译器为v创建了不同的类型,所以您有两个匿名类,具有不同的字段,即使它们具有相同的类型,但它们的名称不同,彼此不兼容

我对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)
应该可以解决这个问题,至少在C中是有效的。

匿名类型标识不仅基于成员的类型,还基于成员的名称。因此,这两个物体的类型不同,即使对人眼来说,它们具有“相同”的结构:

Dim a = New With { .Name = "Bob" }
Dim b = New With { .Moniker = "Robert" }
所以,即使c.AA是一个整数,也不足以使Query和v保持类型兼容

很明显,您的代码是从实际问题中提炼出来的,所以我不能确切地说您应该做什么,但是使用命名类型而不是匿名类型可能会解决您的问题

这在eg 9.0版的VB.NET规范第11.10.4节“匿名对象创建表达式”中有记录。我强调:

如果两个匿名类创建表达式出现在同一个 方法生成相同的结果形状,如果属性顺序, 属性名称和属性类型都匹配,它们都将引用 同一个匿名类

注释

编译器可能会选择进一步统一匿名类型,例如在程序集级别,但此时不能依赖于此

与注释不同的是,我认为对于C,当所有内容都匹配时,编译器确实可以保证程序集中的匿名类型标识

Dim a = New With { .Name = "Bob" }
Dim b = New With { .Moniker = "Robert" }