var的行为

时间:2015-10-08 21:29:36

标签: c# .net

DataTable test = new DataTable();
foreach (var r in test.Rows)
{
    r[1].tostring();
}

为什么编译器不了解r是DataRow? 请参阅下图以获取错误消息。

enter image description here

3 个答案:

答案 0 :(得分:12)

属性DataTable.Rows使用旧样式(非泛型)集合。实际类型为DataRowCollection,它定义了非{0}的an enumerator,因此它返回类型为DataTable test = new DataTable(); foreach (var r in test.AsEnumerable()) { r[1].ToString(); } 的实例。为解决此问题,在名为DataTable.AsEnumerable的框架(3.5+)的更高版本中提供了一种新的扩展方法,该方法返回正确类型的枚举器:

r

如果您遇到旧版本的.NET,则必须手动将DataRow投射到function delayedUpdate(fn, delay, callback) { var nextCall = Date.now(); var data = false; return function () { if (nextCall <= Date.now()) { nextCall = Date.now() + delay; fn(function (err, res) { data = err ? false : res; callback(err, data); }); } else { callback(null, data); } }; }

答案 1 :(得分:1)

DataTable.Rows的类型是DataRowCollection,它继承自InternalDataCollectionBaseICollection是非通用的。{1}}。所以不是 ICollection<DataRow>,而是objects的集合。见here
使用foreach (DataRow r in test.Rows),您明确告诉C#将每个对象强制转换为DataRow

答案 2 :(得分:0)

var是一个隐式类型!它别名任何类型!当你声明一个&#34; var类型&#34;你基本上是告诉编译器嘿看我不知道什么类型适合这个,所以右边的表达式评估的类型是合适的类型!

所以,      显然,每一行都作为一个对象返回,所以除非你将它们转换为适当的类型,否则它们将作为一个对象保留!