启用选项严格时,Linq查询对DataGridViewRow具有隐式转换错误

时间:2009-07-06 20:26:57

标签: vb.net linq option-strict

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

  • 一changeType
  • ChangeStatus
  • ChangeDescription
  • LastChangeDate

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

问题是,当启用了option strict时,获取网格中所选项的查询会给我一个隐式转换错误。

这是查询...

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时使用它。我在这里错过了什么吗?有人有建议吗?

1 个答案:

答案 0 :(得分:3)

(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