当Option Strict为支持LINQ查询有一个DataGridViewRow隐式转换错误(Li

2019-07-29 17:22发布

我有一个绑定名为“BaseChange”对象列表一个DataGridView。 该BaseChange对象是由4个属性...

  • 一changeType
  • ChangeStatus
  • ChangeDescription
  • LastChangeDate

DataGridView中对所有4个值以及列第五(称为“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作为的DataGridViewRow”代码,以及完整的消息是“ 从‘对象’到‘System.Windows.Forms.DataGridViewRow’隐式转换 ”。

如果我排除“作为的DataGridViewRow”从查询,我得到了_row.Cells和_row.DataBoundItem后期绑定错误,这也失败选项严格。

我需要这与选项严格启用工作,并在VB。 我失去了一些东西在这里? 任何人有任何建议吗?

Answer 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的看到你的行()集合为IEnumerable,所以你行的对象。 说明在底部进入更多细节。

添加:

添加选项推断应该简化这个。

详情参见:

什么是混合VB.NET的选项严格和新的选项推断指令的最佳方式?

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

说明:我做了一些更多的挖掘,为什么它不是简单的。 RowCollection对于一个DataGridView实现老IEnumberable界面返回的对象,而较新的集合类型实现了通用的IEnumerable(Of T)已界面,直接返回类型,消除了对铸件的需求。

请参阅MSDN的实现的接口。



文章来源: Linq query has an implicit cast error for DataGridViewRow when option strict is enabled