次の方法で共有


拡大変換と縮小変換 (Visual Basic)

型変換の重要な考慮事項は、変換の結果が変換先のデータ型の範囲内にあるかどうかです。

拡大変換では、元のデータの可能な任意の値を許可できるデータ型に値が変更されます。 拡大変換はソース値を保持しますが、その表現を変更できます。 これは、整数型から Decimalに、または Char から Stringに変換する場合に発生します。

縮小変換では、可能な値の一部を保持できない可能性があるデータ型に値が変更されます。 たとえば、整数型に変換すると小数部の値が丸められ、 Boolean に変換される数値型は True または Falseに縮小されます。

拡大変換

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

データの種類 データ型に拡大 1
SByte SByteShortIntegerLongDecimalSingleDouble
バイト ByteShortUShortIntegerUIntegerLongULongDecimalSingleDouble
短い ShortIntegerLongDecimalSingleDouble
UShort する UShortIntegerUIntegerLongULongDecimalSingleDouble
整数 IntegerLongDecimalSingleDouble2
UInteger する UIntegerLongULongDecimalSingleDouble2
長い LongDecimalSingleDouble2
ULong する ULongDecimalSingleDouble2
小数 DecimalSingleDouble2
SingleDouble
ダブル Double
任意の列挙型 (列挙型) その基になる整数型と、基になる型が拡大する任意の型。
焦がす CharString
Char 配列 Char 配列 String
任意の型 オブジェクト
任意の派生型 派生元の任意の基本型 3
任意の型 実装するインターフェイス。
何もない 任意のデータ型またはオブジェクト型。

1 定義上、すべてのデータ型はそれ自体に拡大されます。

2IntegerUIntegerLongULong、または Decimal から Single または Double に変換すると、精度が失われる可能性がありますが、大きさが失われることはありません。 この意味では、情報の損失は発生しません。

3 派生型からその基本型への変換が広がっているのは驚くかもしれません。 理由は、派生型に基本型のすべてのメンバーが含まれているため、基本型のインスタンスとして修飾されます。 反対の方向では、基本型には、派生型によって定義された新しいメンバーは含まれません。

拡大変換は実行時に常に成功し、データ損失は発生しません。 Option Strict ステートメントで型チェックスイッチがOnまたはOffに設定されているかどうかに関係なく、常に暗黙的に実行できます。

縮小変換

標準の縮小変換には、次のものが含まれます。

  • 前の表の拡大変換の逆方向 (すべての型がそれ自体に拡大される点を除く)

  • ブール型と任意の数値型の間の双方向の変換

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

  • 文字列と任意の数値型、Boolean、または日付の間のいずれかの方向の変換

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

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

縮小変換エラーは、 For Each…Next コレクション内の要素からループ コントロール変数への変換では抑制されます。 詳細と例については、「 For Each..」の「縮小変換」セクションを参照してください。次のステートメント

縮小変換を使用する場合

ソース値を変換先のデータ型に変換できることがわかっている場合は、縮小変換を使用します。エラーやデータ損失は発生しません。 たとえば、"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  

こちらも参照ください