Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么编译器认为这是一个对象而不是数据行?_.net_Vb.net_Linq_Casting_Option Strict - Fatal编程技术网

.net 为什么编译器认为这是一个对象而不是数据行?

.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

我使用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 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 at
DataTable.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()
          ...