每当希望编译器确定局部变量的类型时,都可以使用隐式类型局部变量。 必须使用隐式类型本地变量来存储匿名类型,这些类型通常用于查询表达式。 以下示例演示了查询中隐式类型局部变量的可选和必需用法。
隐式类型局部变量是使用 var 上下文关键字声明的。 有关详细信息,请参阅 隐式类型化局部变量 和 隐式类型化数组。
例子
以下示例展示了这样一个常见情境:在这一情境中,查询表达式生成匿名类型序列时必须使用 var 关键字。 在此场景中,由于无法访问匿名类型的类型名称,foreach语句中的查询变量和迭代变量必须使用var进行隐式键入。 有关匿名类型的详细信息,请参阅 匿名类型。
private static void QueryNames(char firstLetter)
{
// Create the query. Use of var is required because
// the query produces a sequence of anonymous types:
// System.Collections.Generic.IEnumerable<????>.
var studentQuery =
from student in students
where student.FirstName[0] == firstLetter
select new { student.FirstName, student.LastName };
// Execute the query and display the results.
foreach (var anonType in studentQuery)
{
Console.WriteLine("First = {0}, Last = {1}", anonType.FirstName, anonType.LastName);
}
}
以下示例在类似的情况下使用 var 关键字,但在其中使用 var 是可选的。 由于 student.LastName 是字符串,因此执行查询将返回一系列字符串。 因此,可以将类型 queryId 声明为 System.Collections.Generic.IEnumerable<string> 而不是 var。 关键字 var 用于方便使用。 在此示例中,语句中的 foreach 迭代变量被显式地类型定义为字符串,但也可以使用 var 来声明。 由于迭代变量的类型不是匿名类型,因此使用 var 是一个选项,而不是要求。 请记住, var 本身不是一种类型,而是编译器推断和分配该类型的指令。
// Variable queryId could be declared by using
// System.Collections.Generic.IEnumerable<string>
// instead of var.
var queryId =
from student in students
where student.Id > 111
select student.LastName;
// Variable str could be declared by using var instead of string.
foreach (string str in queryId)
{
Console.WriteLine($"Last name: {str}");
}