拡大変換と縮小変換 (Visual Basic)
型変換で考慮しなければならない重要な点は、変換結果が変換先データ型の範囲内に入るかどうかということです。 拡大変換では、変換元データのすべての値を含むことができるデータ型に値が変更されます。 縮小変換では、値の一部を保持できない可能性があるデータ型に変更されます。
拡大変換
次の表は、標準の拡大変換を示しています。
データ型 |
拡大変換後のデータ型 1 |
SByte, Short, Integer, Long, Decimal, Single, Double |
|
Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double |
|
Short, Integer, Long, Decimal, Single, Double |
|
UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double |
|
Integer, Long, Decimal, Single, Double2 |
|
UInteger, Long, ULong, Decimal, Single, Double 2 |
|
Long, Decimal, Single, Double 2 |
|
ULong, Decimal, Single, Double 2 |
|
Decimal, Single, Double 2 |
|
Single, Double |
|
Double |
|
すべての列挙型 (Enum) |
基になる整数型および拡大変換の基になる任意の型 |
Char, String |
|
Char 配列 |
Char 配列、String |
任意の型 |
|
すべての派生型 |
派生元の基本型 3 |
任意の型 |
実装しているインターフェイス |
任意のデータ型またはオブジェクト型 |
1 定義上、すべてのデータ型は自動的に拡大されます。
2 Integer、UInteger、Long、ULong、または Decimal から Single または Double への変換は、精度が失われる結果となる可能性がありますが、桁数が失われることはありません。 この意味で考えると、情報の損失は起こりません。
3 派生型からその基本型への変換は拡大変換になります。 派生型には基本型のすべてのメンバーが含まれるため、基本型のインスタンスとして扱うことができるためです。 逆に、基本型では派生型で定義されたメンバーが含まれていません。
拡大変換は、実行時には常に正常に行われ、データ消失が発生することはありません。 Option Strict ステートメントで型チェック スイッチを On または Off に設定して、拡大変換を常に暗黙的に実行できます。
縮小変換
標準の縮小変換は次のとおりです。
前の表で示した拡大変換の逆方向 (それ自体に拡大変換する場合の型を除く)
ブール型 (Boolean) と任意の数値型の間の相互変換
任意の数値型から任意の列挙型への変換 (Enum)
データ型またはオブジェクト型の、その派生型への変換
縮小変換は、実行時に常に正しく実行されるとは限りません。したがって失敗またはデータを消失する可能性があります。 変換先のデータ型で変換対象の値を受け入れることができない場合に、エラーが発生します。 たとえば、数値変換ではオーバーフローが発生することがあります。 コンパイラは、Option Strict ステートメントで型チェック スイッチが Off に設定されていない限り、暗黙的な縮小変換の実行を許可しません。
注意
For Each…Next コレクション内の要素からループ制御変数への変換に対して縮小変換エラーが抑制されます。 詳細および例については、「For Each...Next ステートメント (Visual Basic)」の「縮小変換」を参照してください。
縮小変換を使用するタイミング
変換元の値を変換先のデータ型に変換でき、エラーまたはデータの消失が発生しないことがわかっている場合に、縮小変換を使用します。 たとえば、文字列型 (String) に "True" または "False" のいずれかが含まれることが明らかな場合は、CBool キーワードを使用してブール型 (Boolean) に変換できます。
変換中の例外
拡大変換は常に正しく実行されるため、例外をスローすることはありません。 縮小変換が失敗すると、通常は次の例外をスローします。
InvalidCastException — 2 つの型の間で変換が定義されていない場合
OverflowException — (整数型の場合のみ) 変換された値が対象の型にしては大きすぎる場合
クラスまたは構造体で CType 関数 (Visual Basic)を定義して、そのクラスまたは構造体の間の変換演算子として機能させると、その CType は適切と見なされる例外をスローできます。 さらに、その CType は Visual Basic 関数または .NET Framework メソッドを呼び出して、さまざまな例外を順番にスローできます。
参照
処理手順
方法: Visual Basic でオブジェクトを別の型に変換する
参照
概念
Visual Basic での型宣言を省略したプログラミング