Option Infer ステートメント
変数の宣言でローカル型推論を使用できるようにします。
Option Infer { On | Off }
指定項目
用語 |
定義 |
On |
省略可能です。 ローカル型推論を有効にします。 |
Off |
省略可能です。 ローカル型推論を無効にします。 |
解説
ファイルに Option Infer を設定するには、ファイルの先頭に他のソース コードよりも前に Option Infer On または Option Infer Off を入力します。 ファイルの Option Infer に設定した値が IDE またはコマンド ラインに設定した値と競合した場合は、ファイルの値が優先されます。
Option Infer を On に設定すると、データ型を明示的に指定せずにローカル変数を宣言できます。 コンパイラは、初期化式の型から変数のデータ型を推測します。
次の図では、Option Infer がオンになっています。 宣言 Dim someVar = 2 内の変数は、型の推定によって整数として宣言されています。
Option Infer がオンのときの IntelliSense
次の図では、Option Infer がオフになっています。 宣言 Dim someVar = 2 内の変数は、型の推定によって Object として宣言されています。 この例では、Option Strict 設定は [コンパイル] ページ (プロジェクト デザイナー) (Visual Basic) で Off に設定されています。
Option Infer がオフのときの IntelliSense
注意
変数を Object として宣言すると、プログラムの実行中にランタイム型が変更される場合があります。Visual Basic は、ボックス化とボックス化解除という操作を実行して Object と値型との間で変換を行いますが、このために実行速度が低下します。ボックス化とボックス化解除については、「Visual Basic 言語仕様」を参照してください。
型の推定は、プロシージャ レベルで適用され、クラス、構造体、モジュール、またはインターフェイスのプロシージャの外側には適用されません。
詳細については、「ローカル型の推論 (Visual Basic)」を参照してください。
Option Infer ステートメントが指定されていない場合
ソース コードに Option Infer ステートメントが含まれていない場合は、[コンパイル] ページ (プロジェクト デザイナー) (Visual Basic) の Option Infer 設定が使用されます。 コマンド ライン コンパイラを使用した場合は、/optioninfer コンパイラ オプションが使用されます。
IDE の Option Infer を設定するには
ソリューション エクスプローラーでプロジェクトを選択します。 [プロジェクト] メニューの [プロパティ] をクリックします。 詳細については、「Introduction to the Project Designer」を参照してください。
[コンパイル] タブをクリックします。
[Option infer] ボックスに値を設定します。
新しいプロジェクトを作成すると、[コンパイル] タブの [Option Infer] 設定が [VISUAL BASIC の既定値] ダイアログ ボックスの [Option Infer] 設定に設定されます。 [VISUAL BASIC の既定値] ダイアログ ボックスにアクセスするには、[ツール] メニューで [オプション] をクリックします。 [オプション] ダイアログ ボックスの [プロジェクトおよびソリューション] を展開し、[VISUAL BASIC の既定値] をクリックします。 [VISUAL BASIC の既定値] の初期の既定値は On です。
コマンド ラインで Option Infer を設定するには
- vbc コマンドに /optioninfer コンパイラ オプションを含めます。
既定のデータ型と値
次の表では、Dim ステートメントのデータ型と初期化子を指定するさまざまな組み合わせの結果を示します。
データ型が指定されているか |
初期化子が指定されているか |
例 |
結果 |
X |
X |
Dim qty |
Option Strict がオフ (既定値) の場合、変数は Nothing に設定されます。 Option Strict がオンの場合、コンパイル時エラーが発生します。 |
X |
○ |
Dim qty = 5 |
Option Infer がオン (既定値) の場合、変数は初期化子のデータ型になります。 「ローカル型の推論 (Visual Basic)」を参照してください。 Option Infer がオフで、Option Strict がオフの場合、変数は Object のデータ型になります。 Option Infer がオフで、Option Strict がオンの場合、コンパイル時エラーが発生します。 |
○ |
X |
Dim qty As Integer |
変数は、データ型の既定値に初期化されます。 詳細については、「Dim ステートメント (Visual Basic)」を参照してください。 |
○ |
○ |
Dim qty As Integer = 5 |
初期化子のデータ型を指定したデータ型に変換できない場合は、コンパイル時エラーが発生します。 |
使用例
次の例では、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
次の例では、変数が 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
参照
関連項目
Option Explicit ステートメント (Visual Basic)
[Visual Basic の既定値] ([オプション] ダイアログ ボックス - [プロジェクト])
ボックス化とボックス化解除 (C# プログラミング ガイド)