Option Infer ステートメント

変数の宣言でローカル型推論を使用できるようにします。

構文

Option Infer { On | Off }

指定項目

用語 定義
On 任意。 ローカル型推論を有効にします。
Off 任意。 ローカル型推論を無効にします。

Remarks

ファイルに Option Infer を設定するには、ファイルの先頭に他のソース コードよりも前に Option Infer On または Option Infer Off を入力します。 ファイルの Option Infer に設定した値が IDE またはコマンド ラインに設定した値と競合した場合は、ファイルの値が優先されます。

Option InferOn に設定すると、データ型を明示的に指定せずにローカル変数を宣言できます。 コンパイラは、初期化式の型から変数のデータ型を推測します。

次の図では、Option Infer がオンになっています。 宣言 Dim someVar = 2 内の変数は、型の推定によって整数として宣言されています。

次のスクリーンショットは、Option Infer がオンの場合の IntelliSense を示しています。

Screenshot showing IntelliSense view when Option Infer is on.

次の図では、Option Infer がオフになっています。 宣言 Dim someVar = 2 内の変数は、型の推定によって Object として宣言されています。 この例では、[コンパイル] ページ、プロジェクト デザイナー (Visual Basic) で、Option Strict 設定がオフ に設定されています。

次のスクリーンショットは、Option Infer がオフの場合の IntelliSense を示しています。

Screenshot showing IntelliSense view when Option Infer is off.

Note

変数を Object として宣言すると、プログラムの実行中にランタイム型が変更される場合があります。 Visual Basic では、ボックス化ボックス化解除という操作を実行して Object と値型との間で変換を行いますが、このために実行速度が低下します。 ボックス化とボックス化解除の詳細については、Visual Basic 言語の仕様に関するページを参照してください。

型の推定は、プロシージャ レベルで適用され、クラス、構造体、モジュール、またはインターフェイスのプロシージャの外側には適用されません。

詳細については、「ローカル型の推論」を参照してください。

Option Infer ステートメントが指定されていない場合

ソース コードに Option Infer ステートメントが含まれていない場合は、[コンパイル] ページ、プロジェクト デザイナー (Visual Basic)Option Infer 設定が使用されます。 コマンドライン コンパイラを使用している場合は、-optioninfer コンパイラ オプションを使用します。

IDE の Option Infer を設定するには

  1. ソリューション エクスプローラーでプロジェクトを選択します。 [プロジェクト] メニューの [プロパティ] をクリックします。

  2. [コンパイル] タブをクリックします。

  3. [Option infer] ボックスに値を設定します。

新しいプロジェクトを作成すると、 [コンパイル] タブの [Option Infer] 設定が [VISUAL BASIC の既定値] ダイアログ ボックスの [Option Infer] 設定に設定されます。 [VISUAL BASIC の既定値] ダイアログ ボックスにアクセスするには、 [ツール] メニューで [オプション] をクリックします。 [オプション] ダイアログ ボックスの [プロジェクトおよびソリューション] を展開し、 [VISUAL BASIC の既定値] をクリックします。 [VISUAL BASIC の既定値] の初期の既定値は On です。

コマンド ラインで Option Infer を設定するには

vbc コマンドに -optioninfer コンパイラ オプションを含めます。

既定のデータ型と値

次の表では、Dim ステートメントのデータ型と初期化子を指定するさまざまな組み合わせの結果を示します。

データ型が指定されているか 初期化子が指定されているか 結果
いいえ いいえ Dim qty Option Strict がオフ (既定値) の場合、変数は Nothing に設定されます。

Option Strict がオンの場合、コンパイル時エラーが発生します。
いいえ はい Dim qty = 5 Option Infer がオン (既定値) の場合、変数は初期化子のデータ型になります。 「ローカル型の推論」を参照してください。

Option Infer がオフで、Option Strict がオフの場合、変数は Object のデータ型になります。

Option Infer がオフで、Option Strict がオンの場合、コンパイル時エラーが発生します。
はい いいえ Dim qty As Integer 変数は、データ型の既定値に初期化されます。 詳細については、「Dim ステートメント」を参照してください。
はい はい Dim qty As Integer = 5 初期化子のデータ型を指定したデータ型に変換できない場合は、コンパイル時エラーが発生します。

例 1

次の例では、Option Infer ステートメントがローカル型推論をどのように有効にするかを示します。

' Enable Option Infer before trying these examples.

' Variable num is an Integer.
Dim num = 5

' Variable dbl is a Double.
Dim dbl = 4.113

' Variable str is a String.
Dim str = "abc"

' Variable pList is an array of Process objects.
Dim pList = Process.GetProcesses()

' Variable i is an Integer.
For i = 1 To 10
    Console.WriteLine(i)
Next

' Variable item is a string.
Dim lst As New List(Of String) From {"abc", "def", "ghi"}

For Each item In lst
    Console.WriteLine(item)
Next

' Variable namedCust is an instance of the Customer class.
Dim namedCust = New Customer With {.Name = "Blue Yonder Airlines",
                                   .City = "Snoqualmie"}

' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

' If customers is a collection of Customer objects in the following 
' query, the inferred type of cust is Customer, and the inferred type
' of custs is IEnumerable(Of Customer).
Dim custs = From cust In customers 
            Where cust.City = "Seattle" 
            Select cust.Name, cust.ID

例 2

次の例では、変数が Object として識別されたときに、ランタイム型が異なる場合があることを示します。

' Disable Option Infer when trying this example.

Dim someVar = 5
Console.WriteLine(someVar.GetType.ToString)

' If Option Infer is instead enabled, the following
' statement causes a run-time error. This is because
' someVar was implicitly defined as an integer.
someVar = "abc"
Console.WriteLine(someVar.GetType.ToString)

' Output:
'  System.Int32
'  System.String

関連項目