次の方法で共有


キャストと型変換 (C# プログラミング ガイド)

C# はコンパイル時に静的に型指定されるため、変数が宣言された後、その型が変数の型に暗黙的に変換可能でない限り、変数を再宣言したり、別の型の値を割り当てたりすることはできません。 たとえば、 string を暗黙的に intに変換することはできません。 そのため、 iintとして宣言した後は、次のコードに示すように、文字列 "Hello" を割り当てることはできません。

int i;

// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";

ただし、値を別の型の変数またはメソッド パラメーターにコピーする必要がある場合があります。 たとえば、パラメーターが doubleとして型指定されたメソッドに渡す必要がある整数変数があるとします。 または、インターフェイス型の変数にクラス変数を割り当てる必要がある場合があります。 このような操作は 型変換と呼ばれます。 C# では、次の種類の変換を実行できます。

  • 暗黙的な変換: 変換は常に成功し、データが失われないため、特別な構文は必要ありません。 たとえば、小さい整数型から大きな整数型への変換、派生クラスから基底クラスへの変換、スパン変換などがあります。

  • 明示的な変換 (キャスト): 明示的な変換には キャスト式が必要です。 キャストは、変換中に情報が失われる可能性がある場合、または他の理由で変換が成功しない可能性がある場合に必要です。 一般的な例としては、精度が低い型または範囲が小さい型への数値変換、基底クラス インスタンスから派生クラスへの変換などがあります。

  • ユーザー定義変換: ユーザー定義の変換では、基底クラスと派生クラスのリレーションシップを持たないカスタム型間の明示的および暗黙的な変換を有効にするために定義できる特殊なメソッドが使用されます。 詳細については、「 ユーザー定義変換演算子」を参照してください。

  • ヘルパー クラスを使用した変換: 整数や System.DateTime オブジェクト、16 進数の文字列、バイト配列など、互換性のない型間で変換するには、 System.BitConverter クラス、 System.Convert クラス、組み込みの数値型の Parse メソッド ( Int32.Parse など) を使用できます。 詳細については、次の記事を参照してください。

  • バイト配列を int に変換する方法

  • 文字列を数値に変換する方法

  • 16 進数文字列と数値型の間で変換する方法

暗黙的な変換

組み込みの数値型の場合、格納する値を切り捨てたり丸めたりせずに変数に収めることができる場合に、暗黙的な変換を行うことができます。 整数型の場合、この制限は、ソース型の範囲がターゲット型の範囲の適切なサブセットであることを意味します。 たとえば、 long 型 (64 ビット整数) の変数は、 int (32 ビット整数) が格納できる任意の値を格納できます。 次の例では、コンパイラは、右側のnumの値を、longに割り当てる前にbigNum型に暗黙的に変換します。

// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;

すべての暗黙的な数値変換の完全な一覧については、組み込みの数値変換に関する記事の「暗黙的な数値変換」セクションを参照してください。

参照型の場合、暗黙的な変換は常にクラスから直接または間接的な基底クラスまたはインターフェイスのいずれかに存在します。 派生クラスには常に基底クラスのすべてのメンバーが含まれているため、特別な構文は必要ありません。

Derived d = new Derived();

// Always OK.
Base b = d;

明示的な変換

ただし、情報を失うリスクなしに変換を行うことができない場合、コンパイラでは、 キャストと呼ばれる明示的な変換を実行する必要があります。 キャストは、変換を明示的に行う方法です。 これは、データ損失が発生するか、実行時にキャストが失敗する可能性があることを認識していることを示します。 キャストを実行するには、変換する式の前に、変換先の型をかっこで囲んで指定します。 次のプログラムは、 doubleint にキャストします。プログラムはキャストなしでコンパイルされません。

double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234

サポートされている明示的な数値変換の完全な一覧については、組み込みの数値変換に関する記事の「明示的な数値変換」セクションを参照してください。

参照型の場合、基本型から派生型に変換する必要がある場合は、明示的なキャストが必要です。

参照型間のキャスト操作では、基になるオブジェクトの実行時の型は変更されません。そのオブジェクトへの参照として使用されている値の型のみが変更されます。 詳細については、「 ポリモーフィズム」を参照してください。

実行時の型変換の例外

一部の参照型変換では、コンパイラはキャストが有効かどうかを判断できません。 正しくコンパイルされるキャスト操作が実行時に失敗する可能性があります。 次の例に示すように、実行時に失敗する型キャストは、InvalidCastException を投げます。

Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time

引数 a を明示的に Reptile にキャストすると、危険な前提になります。 前提を立てるのではなく、型を確認する方が安全です。 C# には、キャストを実際に実行する前に互換性をテストできる is 演算子が用意されています。 詳細については、「 パターン マッチングと as 演算子と is 演算子を使用して安全にキャストする方法」を参照してください。

C# 言語仕様

詳細については、C# 言語仕様「変換」セクションを参照してください。

こちらも参照ください