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);
}