型変換の重要な考慮事項は、変換の結果が変換先のデータ型の範囲内にあるかどうかです。
拡大変換では、元のデータの可能な任意の値を許可できるデータ型に値が変更されます。 拡大変換はソース値を保持しますが、その表現を変更できます。 これは、整数型から Decimalに、または Char から Stringに変換する場合に発生します。
縮小変換では、可能な値の一部を保持できない可能性があるデータ型に値が変更されます。 たとえば、整数型に変換すると小数部の値が丸められ、 Boolean に変換される数値型は True または Falseに縮小されます。
拡大変換
次の表は、標準の拡大変換を示しています。
| データの種類 | データ型に拡大 1 |
|---|---|
| SByte |
SByte、Short、Integer、Long、Decimal、Single、Double |
| バイト |
Byte、Short、UShort、Integer、UInteger、Long、ULong、Decimal、Single、Double |
| Short |
Short、 Integer、 Long、 Decimal、 Single、 Double |
| UShort を する |
UShort、 Integer、 UInteger、 Long、 ULong、 Decimal、 Single、 Double |
| 整数 |
Integer、 Long、 Decimal、 Single、 Double2 |
| UInteger を する |
UInteger、 Long、 ULong、 Decimal、 Single、 Double2 |
| 長い |
Long、 Decimal、 Single、 Double2 |
| ULong を する |
ULong、 Decimal、 Single、 Double2 |
| 小数 |
Decimal、 Single、 Double2 |
| シングル |
Single、Double |
| ダブル | Double |
| 任意の列挙型 (Enum) | 基になる整数型、および基になる型が拡大変換される任意の型。 |
| Char |
Char、String |
Char 配列 |
Char 配列、String |
| 任意の型 | オブジェクト |
| 任意の派生型 | それが派生している任意の基本型 3。 |
| 任意の型 | そのプログラムが実装する任意のインターフェイス。 |
| 何もない | 任意のデータ型またはオブジェクト型。 |
1 定義上、すべてのデータ型はそれ自体に拡大されます。
2Integer、 UInteger、 Long、 ULong、または Decimal から Single または Double に変換すると、精度が失われる可能性がありますが、大きさが失われることはありません。 この意味では、情報の損失は発生しません。
3 派生型からその基本型への変換が広がっているのは驚くかもしれません。 理由は、派生型に基本型のすべてのメンバーが含まれているため、基本型のインスタンスとして修飾されます。 反対の方向では、基本型には、派生型によって定義された新しいメンバーは含まれません。
拡大変換は実行時に常に成功し、データ損失は発生しません。
Option Strict ステートメントで型チェックスイッチがOnまたはOffに設定されているかどうかに関係なく、常に暗黙的に実行できます。
縮小変換
標準の縮小変換には、次のものが含まれます。
前の表に示した拡大変換の逆方向 (すべての型のそれ自体への拡大変換を除く)
ブール型と任意の数値型の間の双方向の変換
任意の数値型から任意の列挙型への変換 (
Enum)データ型またはオブジェクト型から派生した型への変換
縮小変換は実行時に常に成功するとは限らず、失敗したり、データ損失が発生したりする可能性があります。 変換先のデータ型が変換対象の値を受け取ることができない場合、エラーが発生します。 たとえば、数値変換ではオーバーフローが発生する可能性があります。
Option Strict ステートメントで型チェック スイッチがOffに設定されていない限り、コンパイラは縮小変換を暗黙的に実行できません。
注
縮小変換エラーは、 For Each…Next コレクション内の要素からループ コントロール変数への変換では抑制されます。 詳細と例については、「For Each...Next ステートメント」の「縮小変換」セクションを参照してください。
縮小変換を使用する場合
ソース値を変換先のデータ型に変換できることがわかっている場合は、縮小変換を使用します。エラーやデータ損失は発生しません。 たとえば、"True" または "False" が含まれていることがわかっている String がある場合は、 CBool キーワードを使用して Booleanに変換できます。
変換中の例外
拡大変換は必ず成功するため、例外は発生しません。 縮小変換では、エラーが発生した場合によくスローされるのは次の例外です。
InvalidCastException — 2 つの型間で変換が定義されていない場合
OverflowException — 変換された値がターゲット型に対して大きすぎる場合は (整数型のみ)
クラスまたは構造体が、そのクラスまたは構造体との間の変換演算子として機能する CType 関数 を定義している場合、その CType は、適切と見なされる例外をスローできます。 さらに、そのCTypeはVisual Basic関数や.NET Frameworkメソッドを呼び出す可能性があり、結果としてさまざまな例外が発生することがあります。
参照型変換中の変更
参照型からの変換では、ポインターのみが値にコピーされます。 値自体はコピーも変更もされません。 変更できる唯一のことは、ポインターを保持している変数のデータ型です。 次の例では、データ型は派生クラスから基底クラスに変換されますが、両方の変数が指すオブジェクトは変更されません。
' Assume class cSquare inherits from class cShape.
Dim shape As cShape
Dim square As cSquare = New cSquare
' The following statement performs a widening
' conversion from a derived class to its base class.
shape = square
こちらも参照ください
- データ型
- Visual Basic における 型変換
- 暗黙的な変換と明示的な変換
- 文字列と他の型の間の変換
- 方法: Visual Basic でオブジェクトを別の型に変換する
- 配列変換
- データ型
- 型変換関数
.NET