暗黙の型変換と明示的な型変換
更新 : 2007 年 11 月
暗黙の型変換では、ソース コードに特殊な構文は不要です。次の例では、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 |
すべての数値型 (Byte、SByte、および列挙型を含む)、String、Object |
|
CByte |
すべての数値型 (SByte および列挙型を含む)、Boolean、String、Object |
|
CChar |
String, Object |
|
CDate |
String, Object |
|
CDbl |
すべての数値型 (Byte、SByte、および列挙型を含む)、Boolean、String、Object |
|
CDec |
すべての数値型 (Byte、SByte、および列挙型を含む)、Boolean、String、Object |
|
CInt |
すべての数値型 (Byte、SByte、および列挙型を含む)、Boolean、String、Object |
|
CLng |
すべての数値型 (Byte、SByte、および列挙型を含む)、Boolean、String、Object |
|
CObj |
任意の型 |
|
CSByte |
すべての数値型 (Byte および列挙型を含む)、Boolean、String、Object |
|
CShort |
すべての数値型 (Byte、SByte、および列挙型を含む)、Boolean、String、Object |
|
CSng |
すべての数値型 (Byte、SByte、および列挙型を含む)、Boolean、String、Object |
|
CStr |
すべての数値型 (Byte、SByte、および列挙型を含む)、Boolean、Char、Char 配列、Date、Object |
|
CType |
コンマ (,) の後に指定する型 |
基本データ型 (基本型の配列を含む) に変換する場合は、対応する変換キーワードで使用できるのと同じ型。 複合データ型に変換する場合は、それが実装するインターフェイス、およびそれが継承するクラス。 CType をオーバーロードしたクラスまたは構造体に変換する場合は、そのクラスまたは構造体 |
CUInt |
すべての数値型 (Byte、SByte、および列挙型を含む)、Boolean、String、Object |
|
CULng |
すべての数値型 (Byte、SByte、および列挙型を含む)、Boolean、String、Object |
|
CUShort |
すべての数値型 (Byte、SByte、および列挙型を含む)、Boolean、String、Object |
CType 関数
CType 関数 は 2 つの引数について実行されます。最初の引数は変換対象の式であり、2 番目の引数は変換先のデータ型またはオブジェクト クラスです。最初の引数は、型ではなく、式である必要があることに注意してください。
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 を使用して、値を複合データ型および基本型に変換できます。また、次の例のように、オブジェクト クラスをそのインターフェイスの型に強制的に変換することもできます。
' 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 を定義できます。これによって、独自のクラスや構造体の型と別の型の間で値を相互に変換できます。使用例を含む詳細については、「方法 : 変換演算子を定義する」を参照してください。
メモ : |
---|
変換キーワードと共に使用する値は、変換先のデータ型において有効な値である必要があります。有効でない場合はエラーが発生します。たとえば、長整数型 (Long) を整数型 (Integer) に変換する場合は、その長整数型 (Long) の値が整数型 (Integer) の有効範囲内に含まれている必要があります。 |
注意 : |
---|
あるクラス型から別のクラス型に変換する CType を指定する場合、変換先の型が変換元の型から派生した型でなければ、実行時に失敗します。そのようなエラーが発生すると、InvalidCastException 例外がスローされます。 |
ただし、型の一方が独自に定義した構造体またはクラスであり、その構造体またはクラスに CType が定義してある場合、この CType の要件を満たしていれば変換は正常に実行されます。方法 : 変換演算子を定義する を参照してください。
明示的な型変換は、ある式から指定のデータ型またはオブジェクト クラスへのキャストとも呼ばれます。
参照
処理手順
方法 : Visual Basic でオブジェクトを別の型に変換する
概念
Visual Basic での型宣言を省略したプログラミング