C#での型変換

C#のキャストで詰まった所があったので忘れないように書いておこう。


C#の型変換は暗黙的変換と明示的変換の2つがある。

暗黙的型変換

変数に対して別の型の変数を代入すると自動的に型を変換してくれる機能。

int a = 10;
long b = a;
float c = 10.0f;
double d = a;

このように普通に代入式を書いてやるだけで int → long float → double へと変換を行ってくれる。

ただ、暗黙的変換は変換後に情報が失われない場合にのみ可能という条件がつく。 例えば

long a = 10;
int b = a;
double c = 10.0;
float d = c;

64bit整数→32bit整数への変換を行った場合コンパイルエラーになる。

明示的型変換

暗黙的変換で変換できない場合はこちらの明示的型変換を使用してキャストをしてやる必要がある。 暗黙的型変換でエラーになるコードも

long a = 10;
int b = (int)a;
double c = 10.0;
float d = (float)c;

この様に「(変換後の型)変数名」という式にすることで変換を行うことができる。

※だからといってなんでも変換出来るわけではなく文字列型から値型などの無理な変換は行うことはできない。


ここまでは大まか知っていたが今回詰まったのは※で書いたなんでも変換出来るわけではない部分でどういった変換が可なのか不可なのかを知らなかったので発生した。

minijsonを利用してパースされたデータ取り出そうとした際にfloat型に変換しようとした際に[System.InvalidCastException]となってしまった。 minijsonでは値を全てobject型で保存してありobject型から型変換を行う際は明示的型変換でも変換が行えず例外になっていた。

object a = 1.0;
float b = (float)a;  // InvalidCastException

object型のデータを変換する場合元の型(minijsonの少数データならdouble型)に一度変換を行った後に変換を行ってやる必要がある。

プリミティブ型であればobject型から変換する場合であればConvertクラスを利用することで変換を行うことができる。

double型→object型→float型に変換したい場合は下記のようになる。

object a = 1.0;
float b = System.Convert.ToSingle( a );