次の方法で共有


Option Infer ステートメント

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

構文

Option Infer { On | Off }

部品

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

注釈

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

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

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

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

オプション推論がオンの場合の IntelliSense ビューを示すスクリーンショット。

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

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

オプション推論がオフの場合の IntelliSense ビューを示すスクリーンショット。

変数が Objectとして宣言されている場合、プログラムの実行中に実行時の型が変更される可能性があります。 Visual Basic では、 ボックス化 とボックス化 解除 と呼ばれる操作を実行して、 Object と値型の間で変換を行います。これにより、実行速度が低下します。 ボックス化とボックス化解除の詳細については、「 Visual Basic 言語仕様」を参照してください。

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

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

オプション推論ステートメントが存在しない場合

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

IDE でオプション推論を設定するには

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

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

  3. [オプション推論] ボックスで値を設定します。

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

コマンド ラインでオプション推論を設定するには

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

こちらも参照ください