キャストと型変換 (C# プログラミング ガイド)
C# はコンパイル時に静的に型指定されるため、変数を宣言した後、その型が他の変数の型に変換可能である場合を除き、再び宣言したり、他の型の値の格納に使用したりすることはできません。たとえば、整数から任意の文字列に変換することはできません。したがって、次のコードに示すように、i を整数として宣言した後に、"Hello" という文字列を割り当てることはできません。
int i;
i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"
ただし、値を別の型の変数やメソッド パラメーターにコピーする必要がある場合があります。たとえば、パラメーターが double として型指定されているメソッドに整数変数を渡す必要がある場合があります。または、インターフェイス型の変数にクラス変数を割り当てる必要がある場合もあります。この種の操作は型変換と呼ばれます。C# では、次の種類の変換を実行できます。
暗黙の型変換 : 変換はタイプ セーフであり、データが失われることはないため、特別な構文は不要です。たとえば、小さい整数型から大きい整数型に変換したり、派生クラスから基本クラスに変換したりする場合です。
明示的な型変換 (キャスト) : 明示的な型変換にはキャスト演算子が必要です。キャストが必要になるのは、変換時に情報が失われる可能性があるとき、または他の理由により変換が成功しないときです。典型的な例としては、精度の低い型または範囲の狭い型への数値変換や、基本クラス インスタンスの派生クラスへの変換があります。
ユーザー定義変換 : ユーザー定義変換は、基本クラスと派生クラスの関係がないカスタム型の間で、明示的な型変換と暗黙の型変換を有効にするために定義できる特別なメソッドによって実行されます。詳細については、「変換演算子 (C# プログラミング ガイド)」を参照してください。
ヘルパー クラスを使用した変換 : 整数と System.DateTime オブジェクト、16 進文字列とバイト配列など、互換性のない型の間で変換を行うには、System.BitConverter クラス、System.Convert クラス、組み込みの数値型の Parse メソッド (Int32.Parse など) を使用できます。詳細については、「方法: バイト配列を int に変換する (C# プログラミング ガイド)」、「方法: 文字列を数値に変換する (C# プログラミング ガイド)」、および「方法: 16 進文字列と数値型の間で変換する (C# プログラミング ガイド)」を参照してください。
暗黙の型変換
組み込みの数値型では、格納する値を切り捨てたり丸めたりしなくても変数に格納できる場合、暗黙の型変換を行うことができます。たとえば、long 型 (8 バイト整数) の変数には、int (32 ビット コンピューター上の 4 バイト) に格納できるどの値でも格納できます。次の例では、コンパイラは、右側の値を long 型に暗黙的に変換してから bigNum に代入しています。
// Implicit conversion. num long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
暗黙の数値変換の一覧については、「暗黙的な数値変換の一覧表 (C# リファレンス)」を参照してください。
参照型の場合、あるクラスから、その直接基本クラスまたは間接基本クラスやインターフェイスへの暗黙的な変換が常に存在します。派生クラスには基本クラスのすべてのメンバーが常に含まれるため、特別な構文は不要です。
Derived d = new Derived();
Base b = d; // Always OK.
明示的な変換
ただし、変換により情報を失う可能性がある場合、コンパイラによりキャストと呼ばれる明示的な変換を実行することが要求されます。キャストは、ユーザーが変換を行うこと、およびデータ損失の可能性を認識していることをコンパイラに明示的に通知する方法です。キャストを実行するには、変換される値または変数の前のかっこ内にキャストする型を指定します。次のプログラムは、double を int にキャストします。このプログラムは、キャストしないとコンパイルできません。
class Test
{
static void Main()
{
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
System.Console.WriteLine(a);
}
}
// Output: 1234
許可される明示的な数値変換の一覧については、「明示的な数値変換の一覧表 (C# リファレンス)」を参照してください。
参照型では、基本型から派生型に変換する必要がある場合、明示的なキャストが必要です。
// Create a new derived type.
Giraffe g = new Giraffe();
// Implicit conversion to base type is safe.
Animal a = g;
// Explicit conversion is required to cast back
// to derived type. Note: This will compile but will
// throw an exception at run time if the right-side
// object is not in fact a Giraffe.
Giraffe g2 = (Giraffe) a;
参照型間のキャスト操作では、基になるオブジェクトのランタイム型は変わらず、そのオブジェクトへの参照として使用される値の型だけが変わります。詳細については、「ポリモーフィズム (C# プログラミング ガイド)」を参照してください。
実行時の型変換の例外
一部の参照型変換では、コンパイラはキャストが有効になるかどうかを判断できません。正常にコンパイルされるキャスト操作が、実行時に失敗する可能性があります。次の例に示すように、実行時に失敗する型キャストにより、InvalidCastException がスローされます。
class Animal
{
public void Eat() { Console.WriteLine("Eating."); }
public override string ToString()
{
return "I am an animal.";
}
}
class Reptile : Animal { }
class Mammal : Animal { }
class UnSafeCast
{
static void Main()
{
Test(new Mammal());
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
static void Test(Animal a)
{
// Cause InvalidCastException at run time
// because Mammal is not convertible to Reptile.
Reptile r = (Reptile)a;
}
}
C# には is 演算子と as 演算子が用意されており、実際にキャストを実行する前に互換性をテストできます。詳細については、「方法: as 演算子と is 演算子を使用して安全にキャストする (C# プログラミング ガイド)」を参照してください。
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
参考書籍の該当する章
More About Variables 入力 Beginning Visual C# 2010
参照
処理手順
方法: 文字列を数値に変換する (C# プログラミング ガイド)