【问题标题】:Linq query has an implicit cast error for DataGridViewRow when option strict is enabled启用选项严格时,Linq 查询对 DataGridViewRow 有一个隐式转换错误
【发布时间】:2009-07-06 20:26:57
【问题描述】:

我有一个绑定到名为“BaseChange”的对象列表的 DataGridView。 BaseChange 对象由 4 个属性组成...

  • 更改类型
  • 更改状态
  • 更改说明
  • 上次更改日期

datagridview 包含所有 4 个值的列以及第 5 个值(称为“colIsSelected”的复选框列)。将列表绑定到网格并显示项目没有问题。

问题是,在启用选项严格时,获取网格中选定项目的查询给了我一个隐式转换错误。

这是查询...

Dim _changes As List(Of BaseChange)

_changes = (From _row As DataGridViewRow In dgvChanges.Rows() _
            Where Convert.ToBoolean(_row.Cells(NAME_COLUMN_IS_SELECTED).Value) = True _
            Select DirectCast(_row.DataBoundItem, BaseChange)).ToList()

...它会在选项严格关闭的情况下产生正确的结果。隐式转换曲线位于“_row As DataGridViewRow”代码上,完整消息是“从 'Object' 到 'System.Windows.Forms.DataGridViewRow' 的隐式转换”。

如果我从查询中排除“As DataGridViewRow”,我会在 _row.Cells 和 _row.DataBoundItem 上收到后期绑定错误,这也会导致选项严格失败。

我需要它来启用 Option Strict 并在 VB 中工作。我在这里错过了什么吗?有人有建议吗?

【问题讨论】:

    标签: vb.net linq option-strict


    【解决方案1】:
    (From _row As DataGridViewRow In dgvChanges.Rows() 
    

    您的 _row 对象类型必须与集合类型的单一版本相匹配。

    如:

        'Assumes Option Strict On and Option Implicit On
        Dim _changes = (From _row In dgvChanges.Rows() _            
               Where Convert.ToBoolean(ctype(_row,DataGridViewRow).Cells(NAME_COLUMN_IS_SELECTED).Value) = True _           
    Select DirectCast(ctype(_row,DataGridViewRow).DataBoundItem, BaseChange)).ToList()
    

    Linq 将您的 Rows() 集合视为 IEnumerable,因此您的行是一个对象。底部的解释更详细。

    添加:

    添加选项推断应该可以简化这一点。

    查看详情:

    What is the best way to mix VB.NET's Option Strict and the new Option Infer directives?

    http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/e3ec737a-42f8-4767-a190-78390202a991/

    说明: 关于为什么它不简单,我做了更多的挖掘。 DataGridView 的 RowCollection 实现了旧的 IEnumberable 接口,该接口返回对象,而新的集合类型实现了 Generic IEnumerable(Of T) 接口,它直接返回类型,无需强制转换。

    请参阅msdn 了解已实现的接口。

    【讨论】:

    • 这解决了问题,但我仍然对为什么 Rows() 集合实际上不被视为 DataGridViewRow 的集合感到有些困惑。你知道我在哪里可以获得更多关于这方面的信息吗?这适用于小型应用程序,但我担心大型应用程序中可能需要的铸造量。我不必为其他(通用)集合类型执行此操作,这是对非通用集合使用 LINQ 时的预期结果吗?它对性能的影响是否像看起来那么大?
    • 我在底部添加了一些文字,基本上,添加选项推断
    • 我在底部添加了“解释”段落,它解释了为什么需要强制转换,而您看到的大多数代码示例中都没有。
    • 谢谢,这很有道理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2017-05-26
    • 2022-11-08
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多