C#中的"var"类型推断

fea*_*net 6 .net c# var type-inference

可能重复:
为什么var在"foreach(table.Rows中的var row)"中评估为System.Object?

今天发现以下内容我感到非常惊讶....

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"]);
}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

这是一种类型推断失败吗?如果是这样,是什么原因造成的?

或者它是定义的行为的一部分还是var?如果是这样,为什么?

我认为这个想法var是你可以在变量声明/初始化的任何地方使用它而不改变行为.

Øyv*_*hen 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();
}
Run Code Online (Sandbox Code Playgroud)

因此,即使列表是 object 类型,它也可以在 foreach 内动态转换为 int。