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

Visual Basic コンパイラは、型の推定を使用して、As 句を使用せずに宣言されたローカル変数のデータ型を決定します。The Visual Basic compiler uses type inference to determine the data types of local variables declared without an As clause. コンパイラは、初期化式の型から変数の型を推測します。The compiler infers the type of the variable from the type of the initialization expression. これにより、次の例に示すように、明示的に型を指定せずに変数を宣言できます。This enables you to declare variables without explicitly stating a type, as shown in the following example. 宣言の結果として、num1num2 の両方が整数として厳密に型指定されます。As a result of the declarations, both num1 and num2 are strongly typed as integers.

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などの宣言を使用して別の型を指定できます。If you do not want num2 in the previous example to be typed as an Integer, you can specify another type by using a declaration like Dim num3 As Object = 3 or Dim num4 As Double = 3.


型の推定は、非静的ローカル変数に対してのみ使用できます。クラスフィールド、プロパティ、または関数の型を判断するために使用することはできません。Type inference can be used only for non-static local variables; it cannot be used to determine the type of class fields, properties, or functions.

ローカル型の推論はプロシージャレベルで適用されます。Local type inference applies at procedure level. モジュールレベルで変数を宣言するために使用することはできません (クラス、構造体、モジュール、またはインターフェイス内で、プロシージャまたはブロック内には含まれません)。It cannot be used to declare variables at module level (within a class, structure, module, or interface but not within a procedure or block). 前の例の num2 がプロシージャ内のローカル変数ではなくクラスのフィールドであった場合、宣言によって Option Strict でエラーが発生し、num2Option Strict off の Object として分類されます。If num2 in the previous example were a field of a class instead of a local variable in a procedure, the declaration would cause an error with Option Strict on, and would classify num2 as an Object with Option Strict off. 同様に、ローカル型の推定は、Staticとして宣言されたプロシージャレベルの変数には適用されません。Similarly, local type inference does not apply to procedure level variables declared as Static.

型推論と遅延バインディングType Inference vs. Late Binding

型の推定を使用するコードは、遅延バインディングに依存するコードに似ています。Code that uses type inference resembles code that relies on late binding. ただし、型の推定では、変数が Objectとして保持されるのではなく、厳密に型になります。However, type inference strongly types the variable instead of leaving it as Object. コンパイラは、コンパイル時に変数の初期化子を使用して、事前バインディングされたコードを生成します。The compiler uses a variable's initializer to determine the variable's type at compile time to produce early-bound code. 前の例では、num1のように num2Integerとして型指定されています。In the previous example, num2, like num1, is typed as an Integer.

事前バインディングされた変数の動作は、遅延バインディングされた変数の動作とは異なり、型は実行時にのみ認識されます。The behavior of early-bound variables differs from that of late-bound variables, for which the type is known only at run time. 型を早期に把握すると、コンパイラは実行前に問題を特定し、メモリを正確に割り当て、その他の最適化を実行できます。Knowing the type early enables the compiler to identify problems before execution, allocate memory precisely, and perform other optimizations. また、事前バインディングを使用すると、Visual Basic 統合開発環境 (IDE) で、オブジェクトのメンバーに関する IntelliSense のヘルプを提供することもできます。Early binding also enables the Visual Basic integrated development environment (IDE) to provide IntelliSense Help about the members of an object. 事前バインディングは、パフォーマンスのためにも推奨されます。Early binding is also preferred for performance. これは、遅延バインディング変数に格納されているすべてのデータが Object型としてラップされる必要があり、実行時にその型のメンバーにアクセスするとプログラムの速度が低下するためです。This is because all data stored in a late-bound variable must be wrapped as type Object, and accessing members of the type at run time makes the program slower.


型の推定は、ローカル変数が As 句なしで宣言されて初期化される場合に発生します。Type inference occurs when a local variable is declared without an As clause and initialized. コンパイラは、割り当てられた初期値の型を変数の型として使用します。The compiler uses the type of the assigned initial value as the type of the variable. たとえば、次のコード行では、String型の変数を宣言しています。For example, each of the following lines of code declares a variable of type String.

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

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

次のコードは、整数の配列を作成する2つの同等の方法を示しています。The following code demonstrates two equivalent ways to create an array of integers.

' 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}

型の推定を使用して、ループコントロール変数の型を決定すると便利です。It is convenient to use type inference to determine the type of a loop control variable. 次のコードでは、前の例の someNumbers2 が整数の配列であるため、コンパイラは numberInteger であると推論します。In the following code, the compiler infers that number is an Integer because someNumbers2 from the previous example is an array of integers.

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

次の例に示すように、Using ステートメントでローカル型の推論を使用して、リソース名の型を設定できます。Local type inference can be used in Using statements to establish the type of the resource name, as the following example demonstrates.

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

変数の型は、次の例に示すように、関数の戻り値から推論することもできます。The type of a variable can also be inferred from the return values of functions, as the following example demonstrates. Process.GetProcesses はプロセスの配列を返すため、pList1pList2 はどちらもプロセスの配列です。Both pList1 and pList2 are arrays of processes because Process.GetProcesses returns an array of processes.

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

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

オプションの推論Option Infer

Option Infer を使用すると、特定のファイルでローカル型の推論が許可されるかどうかを指定できます。Option Infer enables you specify whether local type inference is allowed in a particular file. オプションを有効または禁止するには、ファイルの先頭に次のいずれかのステートメントを入力します。To enable or to block the option, type one of the following statements at the start of the file.

Option Infer On

Option Infer Off

コードで Option Infer の値を指定しない場合、コンパイラの既定値は Option Infer Onになります。If you do not specify a value for Option Infer in your code, the compiler default is Option Infer On.

ファイルの Option Infer に設定した値が IDE またはコマンド ラインに設定した値と競合した場合は、ファイルの値が優先されます。If the value set for Option Infer in a file conflicts with the value set in the IDE or on the command line, the value in the file has precedence.

詳細については、Option Infer ステートメント[コンパイル] ページ (プロジェクトデザイナー) (Visual Basic)を参照してください。For more information, see Option Infer Statement and Compile Page, Project Designer (Visual Basic).

参照See also