【问题标题】:Value of type <anonymous type> cannot be converted to <anonymous type><anonymous type> 类型的值不能转换为 <anonymous type>
【发布时间】:2011-09-24 21:13:48
【问题描述】:

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

在第三行我收到错误Value of type &lt;anonymous type&gt; cannot be converted to &lt;anonymous type&gt;

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.AAInteger,也不足以使 Queryv 类型兼容。

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

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

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

      注释

      编译器可能会选择进一步统一匿名类型,例如在程序集级别,但目前不能依赖这一点。

      与注解相比,我相信对于C#,编译器确实在一切都匹配时保证整个程序集的匿名类型标识。

      【讨论】:

        猜你喜欢
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        相关资源
        最近更新 更多