Option Strict 和匿名类型不兼容?

5

我有一个Linq查询,可以产生匿名类型。但是现在我想使用这个匿名类型的参数,但似乎不起作用。

For Each obj As Object in Query
Dim row As DataRow = obj.parameter
...
Next obj

现在编译器在表达式obj.parameter上抛出一个错误:“Option Strict On不允许晚期绑定”。如果我理解正确,编译器不知道匿名类型的参数。根据Google搜索结果,我尝试了Option Infer On(并删除了As Object),但没有帮助。这似乎很有道理,因为对我来说它总是一个扩展转换。

有什么方法可以解决这个问题,还是我应该创建一个自定义类型?

1个回答

4
声明匿名类型的代码(即LINQ查询的Select部分)必须在使用该代码的方法中,并且Query变量的声明必须具有推断类型。将匿名类型强制转换为Object后,无法访问其属性,因为没有命名类型可以进行强制转换。
因此,请确保你的LINQ查询(或至少是选择新匿名类型的部分)与方法在同一位置。例如:
Dim Query = From prod In products
            Select prod.Name, prod.Price

For Each obj in Query
    Dim name = obj.Name
    ...
Next obj

那么罪魁祸首就是我的IEnumerable声明吗? 我使用的是Dim Query As IEnumerable(Of Object)。 - Martao
看起来这确实解决了问题。使用选项推断会有任何“危险”吗?我应该注意什么? - Martao
3
“@Martao:事实上,你几乎需要使用“Option Infer On”才能高效地使用Linq和匿名类型,没有危险。” - Meta-Knight

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