見出し画像

【C#Tips #4】型変換について

C#は型に厳しい言語です。
そのため、下記のようなコードはエラーを返します。

// 型変換エラー
int num = 100;
string str = num; // 「型'int'を'string'に暗黙的に変換できません」エラーになる

上記のコードではエラーになりますが、例外的に異なる型への変換ができる場合があります。この変換の方法が今日のテーマになります。

暗黙的な変換

値の範囲が狭い型から値の範囲が広い型には無条件で型変換が可能です。
これを暗黙的変換と呼びます。

暗黙的変換可能な型一覧

画像2

上記の表をプログラムで書くと以下のようになります。
下記を実行してもエラーにならないのでご参考になればと思います。

// sbyteの暗黙的変換
Console.WriteLine("-----sbyteの暗黙的変換-----");
sbyte sbyteNum = -128;
short shortNum = sbyteNum;
int intNum = sbyteNum;
long longNum = sbyteNum;
float floatNum = sbyteNum;
double doubleNum = sbyteNum;
Console.WriteLine($"sbyteNum :{sbyteNum}");
Console.WriteLine($"shortNum :{shortNum}");
Console.WriteLine($"intNum   :{intNum}");
Console.WriteLine($"longNum  :{longNum}");
Console.WriteLine($"floatNum :{floatNum}");
Console.WriteLine($"doubleNum:{doubleNum}");
Console.WriteLine("---------------------------");

// byteの暗黙的変換
Console.WriteLine("-----byteの暗黙的変換------");
byte byteNum = 255;
shortNum = byteNum;
ushort ushortNum = byteNum;
intNum = byteNum;
uint uintNum = byteNum;
longNum = byteNum;
floatNum = byteNum;
doubleNum = byteNum;
decimal decimalNum = byteNum;
Console.WriteLine($"byteNum   :{byteNum}");
Console.WriteLine($"ushortNum :{ushortNum}");
Console.WriteLine($"intNum    :{intNum}");
Console.WriteLine($"uintNum   :{uintNum}");
Console.WriteLine($"longNum   :{longNum}");
Console.WriteLine($"floatNum  :{floatNum}");
Console.WriteLine($"doubleNum :{doubleNum}");
Console.WriteLine($"decimalNum:{decimalNum}");
Console.WriteLine("---------------------------");

//shortの暗黙的変換
Console.WriteLine("-----shortの暗黙的変換-----");
shortNum = -32768;
intNum = shortNum;
longNum = shortNum;
floatNum = shortNum;
doubleNum = shortNum;
decimalNum = shortNum;
Console.WriteLine($"shortNum   :{shortNum}");
Console.WriteLine($"intNum     :{intNum}");
Console.WriteLine($"longNum    :{longNum}");
Console.WriteLine($"floatNum   :{floatNum}");
Console.WriteLine($"doubleNum  :{doubleNum}");
Console.WriteLine($"decimalNum :{decimalNum}");
Console.WriteLine("---------------------------");

// ushortの暗黙的変換
Console.WriteLine("----ushortの暗黙的変換-----");
ushortNum = 65535;
intNum = ushortNum;
uintNum = ushortNum;
longNum = ushortNum;
ulong ulongNum = ushortNum;
floatNum = ushortNum;
doubleNum = ushortNum;
decimalNum = ushortNum;
Console.WriteLine($"ushortNum :{ushortNum}");
Console.WriteLine($"intNum    :{intNum}");
Console.WriteLine($"uintNum   :{uintNum}");
Console.WriteLine($"longNum   :{longNum}");
Console.WriteLine($"ulongNum  :{ulongNum}");
Console.WriteLine($"floatNum  :{floatNum}");
Console.WriteLine($"doubleNum :{doubleNum}");
Console.WriteLine($"decimalNum:{decimalNum}");
Console.WriteLine("---------------------------");

// intの暗黙的変換
Console.WriteLine("------intの暗黙的変換------");
intNum = -2147483648;
longNum = intNum;
floatNum = intNum;
doubleNum = intNum;
decimalNum = intNum;
Console.WriteLine($"intNum    :{intNum}");
Console.WriteLine($"longNum   :{longNum}");
Console.WriteLine($"floatNum  :{floatNum}");
Console.WriteLine($"doubleNum :{doubleNum}");
Console.WriteLine($"decimalNum:{decimalNum}");
Console.WriteLine("---------------------------");

// uintの暗黙的変換
Console.WriteLine("-----uintの暗黙的変換------");
uintNum = 4294967295;
longNum = uintNum;
ulongNum = uintNum;
floatNum = uintNum;
doubleNum = uintNum;
decimalNum = uintNum;
Console.WriteLine($"uintNum    :{uintNum}");
Console.WriteLine($"longNum    :{longNum}");
Console.WriteLine($"ulongNum   :{ulongNum}");
Console.WriteLine($"floatNum   :{floatNum}");
Console.WriteLine($"doubleNum  :{doubleNum}");
Console.WriteLine($"decimalNum :{decimalNum}");
Console.WriteLine("---------------------------");

// longの暗黙的変換
Console.WriteLine("-----longの暗黙的変換------");
longNum = -9223372036854775808;
floatNum = longNum;
doubleNum = longNum;
decimalNum = longNum;
Console.WriteLine($"longNum    :{longNum}");
Console.WriteLine($"floatNum   :{floatNum}");
Console.WriteLine($"doubleNum  :{doubleNum}");
Console.WriteLine($"decimalNum :{decimalNum}");
Console.WriteLine("---------------------------");

// charの暗黙的変換
Console.WriteLine("-----charの暗黙的変換------");
char charNum = 'A';
ushortNum = charNum;
intNum = charNum;
uintNum = charNum;
longNum = charNum;
ulongNum = charNum;
floatNum = charNum;
doubleNum = charNum;
decimalNum = charNum;
Console.WriteLine($"charNum   :{charNum}→10進数で表現すると65になる");
Console.WriteLine($"ushortNum :{ushortNum}");
Console.WriteLine($"intNum    :{intNum}");
Console.WriteLine($"uintNum   :{uintNum}");
Console.WriteLine($"longNum   :{longNum}");
Console.WriteLine($"ulongNum  :{ulongNum}");
Console.WriteLine($"floatNum  :{floatNum}");
Console.WriteLine($"doubleNum :{doubleNum}");
Console.WriteLine($"decimalNum:{decimalNum}");
Console.WriteLine("---------------------------");

// ulongの暗黙的変換
Console.WriteLine("----ulongの暗黙的変換------");
ulongNum = 18446744073709551615;
floatNum = ulongNum;
doubleNum = ulongNum;
decimalNum = ulongNum;
Console.WriteLine($"ulongNum  :{ulongNum}");
Console.WriteLine($"floatNum  :{floatNum}");
Console.WriteLine($"doubleNum :{doubleNum}");
Console.WriteLine($"decimalNum:{decimalNum}");
Console.WriteLine("---------------------------");
Console.Read();

明示的な変換

暗黙的な変換では値の範囲が狭い型から値の範囲が広い型は無条件に変換可能と話しました。
逆に範囲が広い型から狭い型への変換はエラーになります。

// 変換エラー
int intNum = 100;
byte byteNum = intNum // 「型'int'を'byte'に暗黙的に変換できません」エラーになる

値がデータ型の範囲内に含まれていてもエラーになるのは、必ずしもint型の値がbyte型の範囲に含まれるとは限らないからです。
ですが、値が範囲内に含まれることがわかっていればどうでしょう?
明示的に「この値はbyte型です!」宣言してあげれば変換は可能になります。
明示的に変換をする、これをキャストと言います。
キャスト構文を使って宣言すると以下のようになります。

// 明示的変換(キャスト)
int intNum = 100;
byte byteNum = (byte)intNum; // エラーは発生しない

明示的変換(キャスト)可能な型一覧

画像2

文字列型の変換

これまでは数値変換についてのお話をしました。では文字列型は変換できるのでしょうか?
上記の表にあるように、暗黙的変換および明示的変換では文字列は数値に変換できません。
そこで文字列を数値に変換するメソッドParseを使います。

// 文字列を数値に変換
string srtIntnum = "100";
string strFloatNum = "1.2345";
string strDoubleNum = "3.14";
Console.WriteLine("------文字列数値変換-------");
Console.WriteLine($"int変換   :{int.Parse(srtIntnum)}");  // int型:100
Console.WriteLine($"float変換 :{float.Parse(strFloatNum)}"); //float型:1.2345
Console.WriteLine($"double変換:{double.Parse(strDoubleNum)}"); // double型:3.14
Console.WriteLine("---------------------------");

また、数値を文字列に変換するにはToStringメソッドを使います。

// 数値を文字列に変換
int num = 100;
float fNum = 1.2345f;
double dNum = 3.14;
Console.WriteLine("------数値文字列変換-------");
Console.WriteLine($"int文字列変換   :{num.ToString()}"); //string型 "100"
Console.WriteLine($"float文字列変換 :{fNum.ToString()}"); //string型 "1.2345"
Console.WriteLine($"double文字列変換:{dNum.ToString()}"); //string型 "3.14"
Console.WriteLine("---------------------------");
Console.Read();


型変換について話しました。
記事で記載しているソースは下記に置いてますのでご自由に試してみてください。


この記事が気に入ったらサポートをしてみませんか?