C#の暗黙的型変換と明示的型変換の違いを徹底解説!サンプルコードで学ぶ型変換の基本
はじめに
C#では、異なるデータ型の間で値をやり取りする際に「型変換」が必要になります。型変換には、コンパイラが自動的に行ってくれる暗黙的型変換と、プログラマが意図的に指示する明示的型変換の2種類があります。本記事では、それぞれの特徴と違いをサンプルコードとともにわかりやすく解説します。
暗黙的型変換(Implicit Type Conversion)とは
暗黙的型変換は、C#が型の安全性を保ちながら自動的に実行してくれる変換です。小さい型から大きい型への変換(例:int → long)は、データが失われる恐れがないため、特別な記述をしなくても行えます。
次のコードを見てください。int型の値をlong型の変数に代入しても、エラーにはなりません。
int val1 = 11000; int val2 = 35600; long sum; sum = val1 + val2;
上記のように、2つのint型変数の合計をlong型変数に代入しても問題ありません。これは、代入のタイミングでコンパイラが自動的にint型からlong型へ暗黙的な変換を行ってくれるためです。
サンプルコード
using System;
using System.IO;
namespace Demo {
class Program {
static void Main(string[] args) {
int val1 = 34567;
int val2 = 56743;
long sum;
sum = val1 + val2;
Console.WriteLine("Sum= " + sum);
Console.ReadLine();
}
}
}
実行結果:
Sum= 91310
明示的型変換(Explicit Type Conversion)とは
明示的型変換(キャスト)は、プログラマがキャスト構文などの事前に用意された機能を使って、意図的に行う変換です。大きい型から小さい型への変換(例:double → int)では、データが失われる可能性があるため、コンパイラは自動的には変換せず、明示的な指定を求めてきます。
以下は、double型の値をint型にキャストする例です。
サンプルコード
using System;
namespace Program {
class Demo {
static void Main(string[] args) {
double d = 1234.89;
int i;
// double型をint型にキャスト
i = (int)d;
Console.WriteLine(i);
Console.ReadKey();
}
}
}
実行結果:
1234
(int)d のように、変換先の型名を括弧で囲んで指定することで、double型の値がint型に変換されます。このとき小数点以下は切り捨てられるため、出力結果は「1234」となります。元の値1234.89から小数部分が失われるように、情報が欠落する可能性がある変換こそ、C#が明示的な記述を要求しているのです。
まとめ:暗黙的型変換と明示的型変換の違い比較表
| 項目 | 暗黙的型変換 | 明示的型変換 |
|---|---|---|
| 実行者 | コンパイラが自動的に実行 | プログラマが明示的に指定 |
| 安全性 | 型安全(データ損失なし) | データ損失の可能性あり |
| 変換方向 | 小さい型 → 大きい型 | 大きい型 → 小さい型 など |
| 記述方法 | そのまま代入するだけ | (int)d のようにキャストを記述 |
暗黙的型変換は安全で手軽ですが、逆方向の変換や精度が落ちる可能性がある変換では、明示的型変換によって開発者の意図をコード上で明確にする必要があります。両者の特性を正しく理解し、状況に応じて使い分けることが、バグの少ない堅牢なC#プログラムを書くための重要なポイントです。
-
C言語の型変換入門:暗黙的変換と明示的変換(キャスト)の違いを徹底解説
あるデータ型を別のデータ型へ変換することを「型変換(type conversion)」と呼びます。C言語における型変換には、主に以下の2種類があります。 暗黙的な型変換(implicit conversion) 明示的な型変換(explicit conversion) 暗黙的な型変換とは 演算対象(オペランド)同士のデータ型が異なる場合、コンパイラが自動的に行う型変換です。 プログラマが特に指示しなくても、小さいデータ型から大きいデータ型への変換が自動的に実行されます。これを「型の昇格」とも呼びます。 int i,x; float f; double d; long int l;
-
【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説
C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。時計回り/らせんルールとは宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、cons