可能重复:
Why does var evaluate to System.Object in “foreach (var row in table.Rows)”?
我今天发现以下内容时感到非常惊讶......
SqlDataReader reader = cmd.ExecuteReader();
DataTable schemaTable = reader.GetSchemaTable();
// the following compiles correctly
foreach (DataRow field in schemaTable.Rows)
{
Console.WriteLine(field["ColumnName"]);
}
// the following does not compile as 'var' is of type 'object'
foreach (var field in schemaTable.Rows)
{
// Error: Cannot apply indexing with [] to an expression of type 'object'
Console.WriteLine(field["ColumnName"]);
}
这是怎么回事?
这是一种类型推断失败吗?如果是这样,是什么原因造成的?
或者它是定义的行为的一部分还是var
?如果是这样,为什么?
我认为var
的想法是你可以在变量声明/初始化的任何地方使用它而不改变行为。
答案 0 :(得分:4)
这里的要点不是var,而是foreach循环。除了迭代自己之外,foreach循环还可以选择强制转换迭代器。
所以你可以做到以下几点:
List<object> test = new List<object>();
test.Add(1);
test.Add(2);
test.Add(3);
foreach( int i in test ){
i.Dump();
}
所以即使列表是object类型,它也可以在foreach中随意转换为int。
答案 1 :(得分:1)
DataTable.Rows
返回System.Data.DataRowCollection
的{{1}}的子类。
此InternalDataCollectionBase
memthod返回GetEnumerator
,而不是IEnumerator
。
因此,唯一可用的类型信息是它返回IEnumerator<DataRows>
,因此当您指定枚举object
时,您正在添加自己的强制转换,DataRow
没有。
答案 2 :(得分:0)
令人困惑的是foreach(SomeType thing in SomeCollection)
不仅仅遍历集合,它还会在迭代时为每个项目尝试转换为SomeType。但是对于var,没有什么可以施展的。