暗黙の型変換と明示的な型変換 (Visual Basic)

"暗黙の変換" では、ソース コードに特別な構文は必要ありません。 次の例で、Visual Basic は、k の値を単精度浮動小数点値に暗黙的に変換してから、q に代入します。

Dim k As Integer
Dim q As Double
' Integer widens to Double, so you can do this with Option Strict On.
k = 432
q = k

"明示的な変換" では、型変換キーワードを使用します。 Visual Basic には、このようなキーワードがいくつか用意されており、これらを使用すると、かっこ内の式が目的のデータ型に強制的に変換されます。 これらのキーワードは関数と同様に機能しますが、コンパイラによってインラインでコードが生成されるため、関数呼び出しに比べて実行速度が若干速くなります。

次に示すのは前の例を拡張したものですが、CInt キーワードによって q の値が整数に変換された後で k に代入されます。

' q had been assigned the value 432 from k.
q = Math.Sqrt(q)
k = CInt(q)
' k now has the value 21 (rounded square root of 432).

変換キーワード

次の表に、使用可能な変換キーワードを示します。

型変換キーワード 式の変換先のデータ型 変換可能な式のデータ型
CBool Boolean データ型 任意の数値型 (ByteSByte、列挙型など)、StringObject
CByte Byte データ型 任意の数値型 (SByte や列挙型など)、BooleanStringObject
CChar Char データ型 StringObject
CDate Date データ型 StringObject
CDbl Double 型 任意の数値型 (ByteSByte、列挙型など)、BooleanStringObject
CDec Decimal データ型 任意の数値型 (ByteSByte、列挙型など)、BooleanStringObject
CInt Integer データ型 任意の数値型 (ByteSByte、列挙型など)、BooleanStringObject
CLng Long データ型 任意の数値型 (ByteSByte、列挙型など)、BooleanStringObject
CObj Object 型 任意の型
CSByte SByte データ型 任意の数値型 (Byte や列挙型など)、BooleanStringObject
CShort Short データ型 任意の数値型 (ByteSByte、列挙型など)、BooleanStringObject
CSng Single データ型 任意の数値型 (ByteSByte、列挙型など)、BooleanStringObject
CStr String データ型 任意の数値型 (ByteSByte、列挙型など)、BooleanCharChar 配列、DateObject
CType コンマ (,) の後に指定される型 "基本データ型" (基本型の配列を含む) に変換するときは、対応する変換キーワードと同じ型が許可されます。

"複合データ型" に変換するときは、実装するインターフェイスと継承するクラス

CType をオーバーロードしたクラスまたは構造体に変換するときは、そのクラスまたは構造体
CUInt UInteger データ型 任意の数値型 (ByteSByte、列挙型など)、BooleanStringObject
CULng ULong データ型 任意の数値型 (ByteSByte、列挙型など)、BooleanStringObject
CUShort UShort データ型 任意の数値型 (ByteSByte、列挙型など)、BooleanStringObject

CType 関数

CType 関数は、2 つの引数に対して動作します。 1 つ目は変換される式、2 つ目は変換先のデータ型またはオブジェクト クラスです。 1 つ目の引数は型ではなく式である必要があることに注意してください。

CType は "インライン関数" です。つまり、多くの場合、関数呼び出しを生成せず、コンパイルされたコードが変換を行います。 これによってパフォーマンスも向上します。

CType と他の型変換キーワードとの比較については、「DirectCast 演算子」と「TryCast 演算子」を参照してください。

基本型

次の例は、CType の使い方を示しています。

k = CType(q, Integer)
' The following statement coerces w to the specific object class Label.
f = CType(w, Label)

複合型

CType を使用すると、値を基本型だけでなく複合データ型にも変換できます。 また、これを使用して、次の例のように、オブジェクト クラスをそのインターフェイスの型の 1 つに強制的に変換することもできます。

' Assume class cZone implements interface iZone.
Dim h As Object
' The first argument to CType must be an expression, not a type.
Dim cZ As cZone
' The following statement coerces a cZone object to its interface iZone.
h = CType(cZ, iZone)

配列型

CType では、次の例のように配列データ型を変換することもできます。

Dim v() As classV
Dim obArray() As Object
' Assume some object array has been assigned to obArray.
' Check for run-time type compatibility.
If TypeOf obArray Is classV()
    ' obArray can be converted to classV.
    v = CType(obArray, classV())
End If

詳細および例については、「配列の変換」を参照してください。

CType を定義する型

定義したクラスまたは構造体で CType を定義できます。 これにより、クラスまたは構造体の型との間で値を変換できるようになります。 詳細および使用例については、「方法:変換演算子を定義する」を参照してください。

Note

変換キーワードと共に使用する値は、変換先のデータ型で有効でなければなりません。そうでない場合、エラーが発生します。 たとえば、LongInteger に変換しようとする場合、Long の値は Integer データ型の有効範囲内である必要があります。

注意事項

CType を指定した、あるクラス型から別のクラス型への変換が実行時に失敗するのは、変換元の型が変換先の型から派生されない場合です。 このような失敗では、InvalidCastException 例外がスローされます。

ただし、型のいずれかが定義した構造体またはクラスであり、その構造体またはクラスに CType を定義している場合、それが CType の要件を満たすと変換が成功する可能性があります。 「方法:変換演算子を定義する」を参照してください。

明示的な変換の実行は、指定のデータ型またはオブジェクト クラスへの式の "キャスト" とも呼ばれます。

関連項目