C#中的“var”类型推断

时间:2011-02-08 13:38:09

标签: c# .net type-inference var

  

可能重复:
  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的想法是你可以在变量声明/初始化的任何地方使用它而不改变行为

3 个答案:

答案 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,没有什么可以施展的。