C#

C# | 暗黙的キャストの活用:データ型キャストの完全ガイド

2024年4月19日

本ページはプロモーションが含まれています

C#暗黙的キャストアイキャッチ画像

暗黙的キャストは、変数や式を明示的に型変換せずに別のデータ型に自動的に変換する方法です。

int intValue = 10;
double doubleValue = intValue; // intからdoubleへの暗黙的キャスト

Console.WriteLine($"intValue: {intValue}, doubleValue: {doubleValue}");

データ型一覧

以下の記事が参考になると思いますので、良ければどうぞ。

暗黙的なキャストとは?

ポイント

暗黙的なキャストは、プログラムで値の型が自動的に変換されることを意味します。

たとえば、整数型の値を浮動小数点型の変数に代入する場合、C#はその変換を自動的に行います。
これにより、プログラマが明示的に変換のコードを書く必要がなく、コンパイラが必要な変換を自動で処理してくれるため、プログラムを書く際の手間が減ります。

暗黙的なキャストは特に、小さなデータ型 ⇒ 大きなデータ型への変換でよく使われます。

例えば、int から longfloat から double への変換などがこれに該当します。

暗黙的なキャストの例

例えば、次のようなコードがあるとします。

int x = 10;
double y = x;

上記のコードは、整数型intの変数 x を宣言し、その後で浮動小数点型doubleの変数 y に x の値を代入しています。

このコードで、int 型の変数 x の値を double 型の変数 y に代入しているけど、どうして特にキャストを書かなくていいの?

ねこ
ねこ
たく
たく

実は、int 型から double 型への変換は自動的に行われるんだ。
だから、プログラマがわざわざキャストを書く必要がないんだよ。

なるほど、つまり自動的に intdouble に変わるから、明示的にキャストしなくても大丈夫なんだね!

ねこ
ねこ
たく
たく

その通りです!
暗黙的キャストのおかげで、コードがスッキリしますね。

この代入文では、x の値が自動的に double 型に変換されます。
この変換は暗黙的なキャストによって行われます。

さまざまな暗黙的なキャスト

暗黙的なキャストには主に以下のようなものがあります。

  • byte(整数型)からint(整数型)への暗黙的なキャスト
  • float (浮動小数点型)から double (浮動小数点型)への暗黙的なキャスト
  • 列挙型からint(整数型)への変換

byte(整数型)からint(整数型)への暗黙的なキャスト

小さいデータ型 → 大きいデータ型へ変換

byte byteValue = 25;
int intValue = byteValue;
Console.WriteLine("byteValue: " + byteValue);
Console.WriteLine("intValue: " + intValue);

実行結果

byteValue: 25
intValue: 25

float (浮動小数点型)から double (浮動小数点型)への暗黙的なキャスト

小さいデータ型 → 大きいデータ型へ変換

float floatValue = 3.14f;
double doubleValue = floatValue;
Console.WriteLine("floatValue: " + floatValue);
Console.WriteLine("doubleValue: " + doubleValue);

実行結果

floatValue: 3.14
doubleValue: 3.140000104904175

注意点として、float から double へのキャストでは、double 型の精度が float 型よりも高いため、わずかな違いが表示されることがあります。これは float 型の値が double 型に変換される際の精度の違いによるものです。

列挙型(Enum) から int(整数型)への変換

列挙型(Enum) → 整数型への変換

using System;

public class Program
{
    // 列挙型の定義
    enum Days
    {
        Sunday,    // 0
        Monday,    // 1
        Tuesday,   // 2
        Wednesday, // 3
        Thursday,  // 4
        Friday,    // 5
        Saturday   // 6
    }

    public static void Main()
    {
        // 列挙型の値を変数に代入
        Days today = Days.Wednesday;

        // 列挙型からintへの変換(明示的なキャスト)
        int dayNumber = (int)today;

        // 結果を出力
        Console.WriteLine("Enum value: " + today);
        Console.WriteLine("Integer value: " + dayNumber);
    }
}

実行結果

Enum value: Wednesday
Integer value: 3

暗黙的なキャストが使えない場面

とても便利な暗黙的なキャストですが、使用できない場面も存在します。
以下はその例です。

大きなデータ型から小さなデータ型への変換

情報の損失が発生する可能性があるため、明示的なキャストが必要です。

int intValue = 1000;
byte byteValue = intValue; // コンパイルエラー。intからbyteへの暗黙的なキャストは禁止

浮動小数点型から整数型への変換

小数点以下の情報が失われるため、明示的なキャストが必要です

double doubleValue = 10.5;
int intValue = doubleValue; // コンパイルエラー。doubleからintへの暗黙的なキャストは禁止

異なる参照型間の変換

クラス間の暗黙的なキャストはサポートされていない。

class A { }
class B { }
A a = new A();
B b = a; // コンパイルエラー。異なる参照型間の暗黙的なキャストは禁止

暗黙的なキャストの注意点

  1. 情報の損失
    変換元のデータ型が変換先のデータ型の範囲外の値を持っている場合、情報の損失が発生する可能性があります。例えば、浮動小数点型から整数型への変換では、小数点以下の値が切り捨てられるため、情報の損失が発生することがあります。
  2. 意図しない挙動
    暗黙的なキャストによって、意図しない挙動が発生することがあります。特に、異なるデータ型同士での変換が行われる場合には、予期しない結果が生じる可能性があります。
  3. コードの読みやすさ
    暗黙的なキャストはコードの読みやすさを向上させることがありますが、逆にコードの意図が不明瞭になることもあります。特に、複雑な変換が行われる場合や、データの変換によって情報の損失が生じる可能性がある場合には、明示的なキャストを使用する方がコードの意図がより明確になります。明示的なキャストを使うことで、変換が意図的に行われていることがはっきりし、コードの可読性と理解しやすさが向上します。
  4. プラットフォーム依存性
    暗黙的なキャストはプログラミング言語やプラットフォームに依存する場合があります。そのため、コードの移植性や互換性を考慮する必要があります。*1

*1 プラットフォームは、プログラムが実行されるオペレーティングシステム(Windows、Linux、macOSなど)、ハードウェアアーキテクチャ(x86、ARMなど)、および実行環境(デスクトップ、サーバー、モバイルデバイスなど)を含みます。プログラムが実行される環境が変わると、プログラムの動作や挙動が異なる場合があります。

まとめ

  • キャスト演算子のようなものはなく、自動でコンパイラが変換してくれる。
  • int →long float → doubleなど小さなデータ型から大きなデータ型への変換
  • 浮動小数点型から整数型への変換は小数点以下が失われる。
  • クラス間の暗黙的なキャストはサポートされていない。

Follow me!

-C#
-,

PAGE TOP