次の方法で共有


ローカル型の推論 (Visual Basic)

Visual Basic コンパイラは 、型推論 を使用して、 As 句なしで宣言されたローカル変数のデータ型を決定します。 コンパイラは、初期化式の型から変数の型を推論します。 これにより、次の例に示すように、型を明示的に指定せずに変数を宣言できます。 宣言の結果として、 num1num2 の両方が整数として厳密に型指定されます。

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub

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

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

ローカル型の推論はプロシージャ レベルで適用されます。 変数をモジュール レベルで宣言するために使用することはできません (クラス、構造体、モジュール、またはインターフェイス内では、プロシージャまたはブロック内では宣言できません)。 前の例のnum2がプロシージャ内のローカル変数ではなくクラスのフィールドである場合、宣言によってOption Strictがオンのエラーが発生し、num2Option StrictオフのObjectとして分類されます。 同様に、ローカル型推論は、 Staticとして宣言されたプロシージャ レベルの変数には適用されません。

型推論と遅延バインディング

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

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

例示

型推論は、ローカル変数が 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は整数の配列であるため、コンパイラはnumberIntegerであると推測しています。

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

次の例に示すように、変数の型は関数の戻り値から推論することもできます。 Process.GetProcessesはプロセスの配列を返すので、pList1pList2の両方がプロセスの配列です。

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

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

オプション推論

Option Infer では、特定のファイルでローカル型の推論を許可するかどうかを指定できます。 オプションを有効またはブロックするには、ファイルの先頭に次のいずれかのステートメントを入力します。

Option Infer On

Option Infer Off

コードで Option Infer の値を指定しない場合、コンパイラの既定値は Option Infer On

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

詳細については、「 Option Infer ステートメントコンパイル」ページ、プロジェクト デザイナー (Visual Basic)を参照してください。

こちらも参照ください