类型 <匿名类型> 的值无法转换为 <匿名类型>。

3

我相信我一定做错了什么事情,但是最好向专家请教。

在第三行,我收到了错误提示:类型为<anonymous type>的值无法转换为<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个回答

3
由于您命名的字段不同(也许类型也不同,因为我不知道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#中可以使用。

1

匿名类型的身份不仅基于成员的类型,还基于它们的名称。因此,即使对于人类来说,这两个对象具有“相同”的结构,它们也是不同类型的:

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#,只要一切匹配,编译器确实可以保证匿名类型在程序集中的身份。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接