明示的な変換
更新 : 2007 年 11 月
明示的な変換とは、言語固有の方法で実行される変換です。一部のコンパイラでは、縮小変換のサポートのために明示的な変換が必要となります。
共通言語ランタイムに対応する言語のほとんどは明示的な変換をサポートしていますが、具体的な手法は言語ごとに異なります。たとえば、共通言語ランタイムに対応する一部の言語では特定の変換を明示的に実行する必要がありますが、別の言語では同じ変換を暗黙的に実行できる場合もあります。同様に、言語によっては、ある条件下では特定の変換を明示的に実行する必要がありますが (たとえば、Visual Basic で Option Strict がオンに設定されている場合)、別の条件下では変換が暗黙的に実行されることがあります (たとえば、Visual Basic で Option Strict がオフに設定されている場合)。明示的な変換の詳細については、使用する言語のドキュメントを参照してください。
C# や C++ などの一部の言語では、キャストを使用して明示的な変換が実行されます。キャストは、実行する変換の種類を定義するデータ型を変換のプレフィックスとして指定した場合に実行されます。Visual Basic などの他の言語では、変換関数を使用して明示的な変換が実行されます。Visual Basic では、暗黙的には変換できないデータ型を明示的に変換できるようにするために、CType 関数や、いずれかの型変換関数 (CStr や CInt など) が使用されます。
ほとんどのコンパイラでは、チェックを行う形でも行わない形でも明示的な変換を実行できます。チェックを行う変換を実行すると、変換結果の型の値が変換先の型の範囲外になる場合に、OverflowException がスローされます。チェックを行わない変換を同じ条件で実行した場合、値の変換によって例外が発生することはありませんが、実際の動作は不定であり、結果が正しくない値になることがあります。
メモ : |
---|
C# では、キャスト演算子と共に checked キーワードを使用するか、または /checked+ コンパイラ オプションを指定することで、チェックを行う変換を実行できます。反対に、チェックを行わない変換を実行する場合は、キャスト演算子と共に unchecked キーワードを使用するか、または /checked- コンパイラ オプションを指定します。既定では、明示的な変換はチェックされません。Visual Basic では、プロジェクトの [コンパイラの詳細設定] ダイアログ ボックスで [整数オーバーフローのチェックを解除] チェック ボックスをオフにするか、または /removeintchecks- コンパイラ オプションを指定することで、チェックを行う変換を実行できます。反対に、チェックを行わない変換を実行する場合は、プロジェクトの [コンパイラの詳細設定] ダイアログ ボックスで [整数オーバーフローのチェックを解除] チェック ボックスをオンにするか、または /removeintchecks+ コンパイラ オプションを指定します。既定では、明示的な変換のチェックが行われます。 |
Int32.MaxValue の Byte 値への変換を試みる例を次に示します。この例では、C# のキャストはチェックされません。整数値が変換先の Byte データ型の範囲外になっても、変換処理では OverflowException がスローされないことに注意してください。
// The integer value is set to 2147483647.
int myInt = int.MaxValue;
try
{
byte myByte = (byte)myInt;
Console.WriteLine("The byte value is {0}.", myByte);
}
catch (OverflowException)
{
Console.WriteLine("Unable to convert {0} to a byte.", myInt);
}
// The value of MyByte is 255, the maximum value of a Byte.
// No overflow exception is thrown.
Visual Basic でチェックを行う CByte 関数を使用する場合と、C# で checked キーワードを指定したチェックを行うキャストを使用する場合について、明示的な変換の例を次に示します。この例では、Int32.MaxValue を Byte 値に変換しようとしています。ただし、Int32.MaxValue が Byte データ型の範囲外である場合は、OverflowException がスローされます。
' The integer value is set to 2147483647.
Dim myInt As Integer = Integer.MaxValue
Try
Dim myByte As Byte = CByte(myInt)
Console.WriteLine("The byte value is {0}.", myByte)
Catch e As OverflowException
Console.WriteLine("Unable to convert {0} to a byte.", myInt)
End Try
' Attempting to convert Int32.MaxValue to a Byte
' throws an OverflowException.
// The integer value is set to 2147483647.
int myInt = int.MaxValue;
try
{
byte myByte = checked ((byte) myInt);
Console.WriteLine("The byte value is {0}.", myByte);
}
catch (OverflowException)
{
Console.WriteLine("Unable to convert {0} to a byte.", myInt);
}
// Attempting to convert Int32.MaxValue to a Byte
// throws an OverflowException.
明示的な変換で生成される結果は言語によって異なることがあり、これらの結果は対応する Convert メソッドの動作とは異なることがあることに注意してください。明示的な変換の動作の詳細については、使用する言語のドキュメントを参照してください。たとえば、Visual Basic で CInt 関数を使用して Double 値を Int32 値に変換すると、結果の値は丸められます。しかし、C# で明示的な変換を使用して同じ変換を実行した場合、小数点以下の値は切り捨てられます。明示的な変換を使用して倍精度浮動小数点値を整数値に変換するコード例を次に示します。
Dim myDouble As Double = 42.72
Dim myInt As Integer = CInt(myDouble)
Console.WriteLine(myInt)
' myInt has a value of 43.
Double myDouble = 42.72;
int myInt = checked ((int)myDouble);
Console.WriteLine(myInt);
// myInt has a value of 42.