拡大変換と縮小変換

更新 : 2008 年 7 月

型変換で考慮しなければならない重要な点は、変換結果が変換先データ型の範囲内に入るかどうかということです。拡大変換では、変換元データのすべての値を含むことができるデータ型に値が変更されます。縮小変換では、値の一部を保持できない可能性があるデータ型に変更されます。

拡大変換

次の表は、標準の拡大変換を示しています。

データ型

拡大変換後のデータ型 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)

Long, Decimal, Single, Double2

ulong

ULong, Decimal, Single, Double2

10 進数

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 に設定して、拡大変換を常に暗黙的に実行できます。

縮小変換

標準の縮小変換は次のとおりです。

  • 前の表で示した拡大変換の逆方向 (それ自体に拡大変換する場合の型を除く)

  • ブール型 (Boolean) と任意の数値型の間の相互変換

  • 任意の数値型から任意の列挙型への変換 (Enum)

  • 文字列型と、任意の数値型、Boolean、または日付型の間の相互変換

  • データ型またはオブジェクト型の、その派生型への変換

縮小変換は、実行時に常に正しく実行されるとは限りません。したがって失敗またはデータを消失する可能性があります。変換先のデータ型で変換対象の値を受け入れることができない場合に、エラーが発生します。たとえば、数値変換ではオーバーフローが発生することがあります。コンパイラは、Option Strict ステートメントで型チェック スイッチが Off に設定されていない限り、暗黙的な縮小変換の実行を許可しません。

k1e94s7e.alert_note(ja-jp,VS.90).gifメモ :

For Each…Next コレクション内の要素からループ制御変数への変換に対して縮小変換エラーが抑制されます。詳細および例については、「For Each...Next ステートメント (Visual Basic)」の「縮小変換」を参照してください。

縮小変換を使用するタイミング

変換元の値を変換先のデータ型に変換でき、エラーまたはデータの消失が発生しないことがわかっている場合に、縮小変換を使用します。たとえば、文字列型 (String) に "True" または "False" のいずれかが含まれることが明らかな場合は、CBool キーワードを使用してブール型 (Boolean**)** に変換できます。

変換中の例外

拡大変換は常に正しく実行されるため、例外をスローすることはありません。縮小変換が失敗すると、通常は次の例外をスローします。

  • InvalidCastException — 2 つの型の間で変換が定義されていない場合

  • OverflowException — (整数型の場合のみ) 変換された値が対象の型にしては大きすぎる場合

クラスまたは構造体で CType 関数を定義して、そのクラスまたは構造体の間の変換演算子として機能させると、その CType は適切と見なされる例外をスローできます。さらに、その CType は Visual Basic 関数または .NET Framework メソッドを呼び出して、さまざまな例外を順番にスローできます。

参照

処理手順

方法 : Visual Basic でオブジェクトを別の型に変換する

概念

Visual Basic におけるデータ型

暗黙の型変換と明示的な型変換

変換時の値の変化

文字列とその他の型との変換

配列の変換

Visual Basic での型宣言を省略したプログラミング

参照

データ型の概要 (Visual Basic)

データ型変換関数

その他の技術情報

Visual Basic における型変換

履歴の変更

日付

履歴

理由

2008 年 7 月

縮小変換および For Each…Next に関する説明を追加。

カスタマ フィードバック