クエリ式で暗黙的に型指定されるローカル変数および配列を使用する方法 (C# プログラミング ガイド)

コンパイラによってローカル変数の型が決定されるようにする場合は、暗黙的に型指定されたローカル変数を使用できます。 クエリ式でよく使用する匿名型を格納するには、暗黙的に型指定されたローカル変数を使用する必要があります。 以下の例では、クエリで暗黙的に型指定されたローカル変数を省略できる場合と、使用しなければならない場合の両方を示します。

暗黙的に型指定されたローカル変数は、var コンテキスト キーワードを使用して宣言します。 詳細については、「暗黙的に型指定されるローカル変数」と「暗黙的に型指定される配列」を参照してください。

次の例は、var キーワードが必須である一般的なシナリオ (匿名型のシーケンスを生成するクエリ) を示しています。 このシナリオでは、匿名型の型名にアクセスできないため、varを使用して foreach ステートメントのクエリ変数と反復変数の両方を暗黙的に型指定する必要があります。 匿名型の詳細については、「匿名型」を参照してください。

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 の型は、var ではなく System.Collections.Generic.IEnumerable<string> として宣言できます。 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: {0}", str);
}

関連項目