当我输入这个foreach
语句时...
foreach (var row in table.Rows)
var的...the工具提示显示为class System.Object
我搞不懂为什么不是class System.Data.DataRow
。
(如果您想知道,是的,我的代码文件的顶部有using System.Data
。)
如果我显式声明该类型,如...
foreach (DataRow row in table.Rows)
...it工作得很好,没有错误。
如果我这么做了..。
var numbers = new int[] { 1, 2, 3 };
foreach (var number in numbers)
...var的计算结果为struct System.Int32
。因此,问题不在于foreach
子句中的var
不起作用。
所以,DataRowCollection
有一些奇怪的地方,项目不会自动计算为DataRow
。但我想不出那是什么。有谁能解释一下吗?
更新
我真的很纠结到底该怎么回答(Codeka ...In Oliver ),我决定给Codeka打个记号,因为它确实回答了我的问题,但Oliver回答了我应该问的问题:)
发布于 2010-05-07 14:54:31
这是因为DataRowCollection类只实现了IEnumerable
的非泛型版本。所以编译器不知道变量的类型是什么。
通过显式地将类型放入其中,基本上就是告诉编译器生成从object
到DataRow
的显式转换。
这是在泛型出现之前的.NET 1.x版本中添加的许多集合和类存在的问题。
发布于 2010-05-07 15:27:50
虽然codeka是正确的,但是还有一些其他的方法可以让DataTable
和DataRow
变得更加方便。
使用.Net 3.5,您可以添加程序集System.Data.DataSetExtensions
。
它包含一些扩展函数,如AsEnumerable(this System.Data.DataTable)
或Field<T>(this System.Data.DataRow, int)
,您可以在foreach循环中调用它,并将列直接转换为正确的类型:
int columnIndex = 2;
foreach(var row in MyDataTable.AsEnumerable())
{
var content = row.Field<double>(columnIndex);
}
https://stackoverflow.com/questions/2786727
复制相似问题