如何在查询表达式中使用隐式类型的局部变量和数组(C# 编程指南)

每当希望编译器确定局部变量的类型时,都可以使用隐式类型局部变量。 必须使用隐式类型本地变量来存储匿名类型,这些类型通常用于查询表达式。 以下示例演示了查询中隐式类型局部变量的可选和必需用法。

隐式类型局部变量是使用 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}");
}

另请参阅