ローカル型の推論

更新 : 2008 年 7 月

Visual Basic 2008 のコンパイラは、型の推論を使用して、As 句なしで宣言されているローカル変数のデータ型を決定します。コンパイラは、初期化式の型から変数の型を推測します。これにより、次の例で示すように、型を明示的に示さずに変数を宣言できます。

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub
Bb384937.alert_note(ja-jp,VS.90).gifメモ :

ローカル型の推論は、クラスのフィールドの宣言には使用できません。前の例の num2 がローカル変数ではなくフィールドである場合は、Option Strict がオンのときは宣言がエラーになり、Option Strict がオフのときは num2 は Object として分類されます。同様に、Option Strict がオンのときは、静的変数の型を推論できません。Option Strict がオフのときは、Static staticVar = 5 の staticVar の型は Object になります。

型の推論を使用するコードは、遅延バインディングに依存するコードと似ています。ただし、型の推論は、変数を Object のままにするのではなく、変数の型を厳密に指定します。コンパイラは、変数の初期化子を使用してコンパイル時に変数の型を決定し、事前バインディングされたコードを生成します。前の例では、num2 は Integer として型指定されます。

事前バインディングされた変数の動作は、実行時でないと型がわからない遅延バインディングされた変数の動作とは異なります。事前に型がわかっていると、コンパイラは、実行前に問題を識別し、メモリを正確に割り当て、他の最適化を実行することができます。また、事前バインディングを使用すると、Visual Basic の統合開発環境 (IDE: Integrated Development Environment) は、オブジェクトのメンバに関する IntelliSense ヘルプを提供できます。事前バインディングには、パフォーマンスの点でもメリットがあります。これは、遅延バインディングされた変数に格納されるデータはすべて Object 型としてラップされる必要があり、実行時には型のメンバにアクセスするので、プログラムが遅くなるためです。

Bb384937.alert_note(ja-jp,VS.90).gifメモ :

前の例の num2 を Integer として型指定できない場合は、Dim num3 As Object = 3 や Dim num4 As Double = 3 のような宣言を使用して、別の型を指定できます。

型の推論は、As 句なしで宣言されたローカル変数に値が代入される場合に行われます。コンパイラは、変数の型として値の型を使用します。たとえば、次の各コード行は、String 型の変数を宣言しています。

' Using explicit typing.
Dim name1 As String = "Springfield"

' Using local type inference.
Dim name2 = "Springfield"

次のコードは、整数の配列を作成する 2 種類の同等の方法を示します。

' Using explicit typing.
Dim someNumbers1() As Integer = New Integer() {4, 18, 11, 9, 8, 0, 5}

' Using local type inference.
Dim someNumbers2 = New Integer() {4, 18, 11, 9, 8, 0, 5}

型の推論を使用して、ループ制御変数の型を決定できます。次のコードでは、someNumbers2 が整数の配列なので、コンパイラは number が Integer であると推論します。

Dim total = 0
For Each number In someNumbers2
    total += number
Next

次の例で示すように、ローカル型の推論を Using ステートメントで使用して、リソース名の型を設定できます。

Using proc = New System.Diagnostics.Process
    ' Insert code to work with the resource.
End Using

次の例で示すように、関数の戻り値から変数の型を推論することもできます。pList1 と pList2 はどちらも、プロセスのリストです。

' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()

' Using local type inference.
Dim pList2 = Process.GetProcesses()

Option Infer

新しいオプション Option Infer を使用すると、特定のファイルでローカル型の推論を許すかどうかを指定できます。このオプションを有効または無効にするには、次のいずれかのステートメントをファイルの先頭に追加します。

Option Infer On

Option Infer Off

コードで Option Infer の値を指定しないと、コンパイラでの既定により、Visual Basic 2008 で作成されたプロジェクトは Option Infer On になり、以前のバージョンからアップグレードされたプロジェクトは Option Infer Off になります。詳細については、「Option Infer ステートメント」および「/optioninfer」を参照してください。

Bb384937.alert_note(ja-jp,VS.90).gifメモ :

ファイル内の Option Infer の設定値が、IDE またはコマンド ラインでの設定値と競合する場合は、ファイル内の値が優先します。

制約

型の推論は、静的ではないローカル変数に対してのみ使用できます。クラスのフィールド、プロパティ、または関数の型を決定するためには使用できません。

参照

概念

匿名型

事前バインディングと遅延バインディング

Visual Basic における LINQ の概要

参照

For Each...Next ステートメント (Visual Basic)

For...Next ステートメント (Visual Basic)

Option Infer ステートメント

/optioninfer

履歴の変更

日付

履歴

理由

2008 年 7 月

「例」セクションのテキストのループ制御変数の名前をコード内の名前と一致させるために、num から number に変更。

カスタマ フィードバック