Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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
C# 为什么var对“系统对象”进行评估;foreach(表中的变量行.Rows)“;?_C#_Ado.net - Fatal编程技术网

C# 为什么var对“系统对象”进行评估;foreach(表中的变量行.Rows)“;?

C# 为什么var对“系统对象”进行评估;foreach(表中的变量行.Rows)“;?,c#,ado.net,C#,Ado.net,当我输入此foreach语句时 foreach (var row in table.Rows) …var的工具提示显示class System.Object 我不明白为什么它不是类System.Data.DataRow (如果您想知道,是的,我的代码文件顶部有使用System.Data) 如果我显式声明类型,如 foreach (DataRow row in table.Rows) …它工作正常,没有错误 如果我真的 var numbers = new int[] { 1, 2, 3 }

当我输入此
foreach
语句时

foreach (var row in table.Rows)
…var的工具提示显示
class System.Object

我不明白为什么它不是
类System.Data.DataRow

(如果您想知道,是的,我的代码文件顶部有
使用System.Data


如果我显式声明类型,如

foreach (DataRow row in table.Rows)
…它工作正常,没有错误


如果我真的

var numbers = new int[] { 1, 2, 3 };
foreach (var number in numbers)
…var的计算结果为
struct System.Int32
。因此,问题不在于
var
foreach
子句中不起作用


因此,
DataRowCollection
中的项不会自动计算为
DataRow
。但我不知道是什么。有人有解释吗


更新

对于mark(Codeka和Oliver)的哪一个答案,我真的很困惑。最后,我决定标记Codeka的答案,因为它确实回答了我的问题,但Oliver回答了我应该问的问题:)

这是因为类只实现了
IEnumerable
的非泛型版本。因此编译器不知道变量的类型

通过显式地将类型放入其中,基本上可以告诉编译器生成一个从
object
DataRow
的显式转换


在泛型可用之前的.NET 1.x时代添加的许多集合和类都会出现这个问题。

虽然codeka是正确的,但是还有一些其他方法可以更方便地使用这类
数据表
数据行
内容

使用.NET3.5,您可以添加程序集
System.Data.DataSetExtensions

它包含一些扩展函数,如
AsEnumerable(this System.Data.DataTable)
Field(this System.Data.DataRow,int)
使用它,您可以在foreach循环中调用它,并将列直接转换为适当的类型:

int columnIndex = 2;

foreach(var row in MyDataTable.AsEnumerable())
{
    var content = row.Field<double>(columnIndex);
}
int columnIndex=2;
foreach(MyDataTable.AsEnumerable()中的var行)
{
var内容=行字段(columnIndex);
}