Visual Basic .NET Language
オプション推測
サーチ…
それは何ですか?
変数の宣言でローカル型の推論を使用できるようにします。
型推論とは何ですか?
明示的にデータ型を記述することなく、ローカル変数を宣言することができます。コンパイラは、初期化式の型から変数のデータ型を推論します。
Option Infer On :
Dim aString = "1234" '--> Will be treated as String by the compiler
Dim aNumber = 4711 '--> Will be treated as Integer by the compiler
明示的な型宣言に対して:
'State a type explicitly
Dim aString as String = "1234"
Dim aNumber as Integer = 4711
Option Infer Off:
Option Infer Off
したコンパイラの動作は、 ここで既に説明したOption Strict
設定に依存します 。
Option Infer Off - Option Strict Off
明示的な型宣言のないすべての変数はObject
として宣言されます。Dim aString = "1234" '--> Will be treated as Object by the compiler
Option Infer Off - Option Strict On
コンパイラは、明示的な型なしで変数を宣言することはできません。'Dim aString = "1234" '--> Will not compile due to missing type in declaration
有効/無効にする方法
ドキュメントレベル
デフォルトでオンになっていますが、コードファイルの上部にOption Infer On|Off
を設定することで設定できます。オプションはドキュメント全体に適用されます。
プロジェクトレベル
Visual Studioのメニューからそれをオン/オフに切り替えることができます:
プロジェクト> [プロジェクト]のプロパティ> [コンパイル]タブ>オプションの推論
ドロップダウンメニューでOn|Off
を選択します。オプションはドキュメント全体に適用されます。
すべての新しいプロジェクト
次の項目を選択すると、デフォルトですべての新しいプロジェクトに対してオンに切り替えることができます。
ツール>オプション>プロジェクトとソリューション> VBデフォルト>オプション推論
ドロップダウンメニューでOn|Off
を選択します。
型推論を使用する場合
基本的には、可能であればタイプ推論を使用することができます。
ただし、 Option Infer Off
とOption Strict Off
を組み合わせると、望ましくない実行時の動作につながる可能性があるので注意してOption Infer Off
。
Dim someVar = 5
someVar.GetType.ToString() '--> System.Int32
someVar = "abc"
someVar.GetType.ToString() '--> System.String
匿名タイプ
匿名型はOption Infer On
でのみ宣言できます。
LINQを扱うときによく使用されます。
Dim countryCodes = New List(Of String)
countryCodes.Add("en-US")
countryCodes.Add("en-GB")
countryCodes.Add("de-DE")
countryCodes.Add("de-AT")
Dim q = From code In countryCodes
Let split = code.Split("-"c)
Select New With {.Language = split(0), .Country = split(1)}
Option Infer Off
コンパイラはエラーをスローします(Option Strict On
)
q
をtypeobject
(Option Strict Off
)とみなしobject
。
どちらの場合も、匿名型を使用できないという結果が得られます。
二重/小数
デフォルトでは、小数点以下の数値変数はDouble
と見なされます。
Dim aNumber = 44.11 '--> Will be treated as type `Double` by the compiler
Decimal
ような別の型が必要な場合は、変数を初期化した値をマークする必要があります。
Dim mDecimal = 47.11D '--> Will be treated as type `Decimal` by the compiler