.net 为什么编译器认为这是一个对象而不是数据行?
我使用LINQ查询将.net 为什么编译器认为这是一个对象而不是数据行?,.net,vb.net,linq,casting,option-strict,.net,Vb.net,Linq,Casting,Option Strict,我使用LINQ查询将DataTable对象中的数据转换为自定义POCO对象的简单IEnumerable 我的LINQ查询是: Dim dtMessages As DataTable '...dtMessages is instantiated ByRef in a helper data access routine... ' Dim qry = From dr As DataRow In dtMessages.Rows Select Ne
DataTable
对象中的数据转换为自定义POCO对象的简单IEnumerable
我的LINQ查询是:
Dim dtMessages As DataTable
'...dtMessages is instantiated ByRef in a helper data access routine... '
Dim qry = From dr As DataRow In dtMessages.Rows
Select New OutboxMsg With {
.ComputerID = dr(dcComputerID),
.MessageData = dr(dcMessageData),
.OutBoxID = dr(dcOutBoxID),
.OutBoxReceivedID = dr(dcOutBoxReceivedID),
.TrxDate = dr(dcTrxDate)
}
但是,编译器在dr As DataRow
下抛出一条警告消息,消息如下:
Option Strict On不允许从“Object”到“System.Data.DataRow”的隐式转换
为什么我会遇到这个错误?我需要做什么来修复它?我本以为
dtMessages.Rows
返回了类型为DataRow
的集合。这不正确吗?类型System.DataTable
早于.Net中的泛型,因此返回一个普通的旧IEnumerable
而不是IEnumerable(属于DataRow)
,即使在引擎盖下它们是DataRow的实例。因此,上述查询中的dr
类型是Object
,而不是DataRow
您可以通过使用Cast
扩展方法使集合的类型显式化来解决这个问题
From dr As DataRow in dtMessages.Rows.Cast(Of DataRow)
Lok atDataTable.Rows
-它是一个DataRow集合
,只实现IEnumerable
,而不是IEnumerable(数据行的)
幸运的是,有一个扩展方法允许您调用而不是行
AsEnumerable
返回一个IEnumerable(属于数据行)
:
(我更喜欢使用dt.Rows.Cast(数据行)
,因为它给人的印象不太可能是失败的。它更适合DataTable
。不过两者都可以工作。)DataTable.Rows
属性返回DataRow
的集合,但是,该集合并没有实现IEnumerable
,而是实现IEnumerable
,它的作用是IEnumerable
您可以使用dtMessages.Rows.cast()
显示如何声明和实例化dtMessages,将集合项显式强制转换为DataRow
。@bzlm我用更多信息更新了我的帖子只需关闭选项即可!我开玩笑,我开玩笑。@Marc他应该关掉VB.NET@bzlm虽然我通常更喜欢C#而不是VB.NET,但我在VB.NET中编写代码是有报酬的,所以扔掉它将是一个非常昂贵的决定:-)。
Dim qry = From dr As DataRow In dtMessages.AsEnumerable()
...