0Pricing
C# Academy · レッスン

暗黙的変換と明示的変換

互換性のある型の間で安全に変換します。

「暗黙的変換と明示的変換」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

型間の変換

C#では、ある数値型を別の数値型に変換できます。自動的に行われる変換(暗黙的変換)もあれば、明示的なキャストが必要な変換もあります。

using System;

class Program
{
    static void Main()
    {
        int i = 10;
        double d = i;       // implicit
        int back = (int)d;   // explicit
        Console.WriteLine(d + ", " + back);
    }
}

暗黙的変換(拡大変換)

データが失われる可能性がない場合は、暗黙的変換が許可されます。たとえばintからlong、またはintからdoubleへの変換です。キャストは必要ありません。

using System;

class Program
{
    static void Main()
    {
        int i = 42;
        long l = i;      // widening, safe
        double d = i;    // widening, safe
        Console.WriteLine(l + ", " + d);
    }
}

拡大変換が安全な理由

変換先の型は変換元の型のすべての値を表現できるため、コンパイラは変換を暗黙的に許可します。

using System;

class Program
{
    static void Main()
    {
        byte b = 200;
        int i = b;       // byte fits in int
        Console.WriteLine("byte " + b + " -> int " + i);
    }
}

明示的変換(縮小変換)

データが失われる可能性がある場合は、明示的変換(キャスト)が必要です。たとえばdoubleからintへの変換です。(int)valueのように記述します。

using System;

class Program
{
    static void Main()
    {
        double d = 9.78;
        int i = (int)d;   // truncates toward zero -> 9
        Console.WriteLine(i);
    }
}

キャストは丸めず切り捨てる

浮動小数点値を整数にキャストすると、小数部分が削除されます。丸めは行われません。丸めたい場合は、先にMath.Roundを使ってください。

using System;

class Program
{
    static void Main()
    {
        double d = 7.99;
        Console.WriteLine("Cast: " + (int)d);
        Console.WriteLine("Round: " + (int)Math.Round(d));
    }
}

縮小変換でのオーバーフロー

値が変換先の型に収まらない場合、通常のキャストでは値が黙って折り返されることがあります。代わりにcheckedで囲むと、オーバーフロー時に例外をスローできます。

using System;

class Program
{
    static void Main()
    {
        int big = 300;
        byte wrapped = (byte)big;   // 300 wraps to 44
        Console.WriteLine("Wrapped: " + wrapped);

        try
        {
            byte safe = checked((byte)big);
            Console.WriteLine(safe);
        }
        catch (OverflowException)
        {
            Console.WriteLine("checked caught overflow");
        }
    }
}

精度の損失

非常に大きなlongをfloatに変換する場合のように、拡大変換であっても精度が失われることがあります。ただし、その変換は暗黙的に行われます。

using System;

class Program
{
    static void Main()
    {
        long big = 9007199254740993L;
        double approx = big;   // implicit, may lose precision
        Console.WriteLine("long: " + big);
        Console.WriteLine("double: " + approx.ToString("F0"));
    }
}

char と数値の変換

charは対応する数値コードに暗黙的に変換でき、数値をcharに明示的にキャストすることもできます。

using System;

class Program
{
    static void Main()
    {
        char c = 'A';
        int code = c;          // implicit -> 65
        char next = (char)(code + 1);   // explicit -> B
        Console.WriteLine(code + " -> " + next);
    }
}

式での変換

異なる型を組み合わせた算術演算では、演算の前に小さい型が大きい型へ自動的に昇格されます。

using System;

class Program
{
    static void Main()
    {
        int a = 7;
        double b = 2;
        double result = a / b;   // a promoted to double -> 3.5
        Console.WriteLine(result);
    }
}

整数除算の落とし穴

両方のオペランドが整数の場合、除算は整数除算になります。小数の結果を得るには、先に一方をdoubleにキャストしてください。

using System;

class Program
{
    static void Main()
    {
        int a = 7, b = 2;
        Console.WriteLine("int / int: " + (a / b));
        Console.WriteLine("with cast: " + ((double)a / b));
    }
}

まとめ

安全な場合は暗黙的変換を優先し、縮小変換では明示的なキャストを使ってください。また、切り捨て、オーバーフロー、整数除算に注意しましょう。

using System;

class Program
{
    static void Main()
    {
        int total = 17, count = 5;
        double average = (double)total / count;   // cast to avoid integer division
        int rounded = (int)Math.Round(average);
        Console.WriteLine("avg=" + average + ", rounded=" + rounded);
    }
}

確認問題

型変換についての理解度を確認しましょう。

要点の復習

暗黙的変換(拡大変換)は、データが失われない場合に自動的に行われます(int から long、int から double)。明示的変換(縮小変換)では(int)xのようなキャストが必要で、切り捨てやオーバーフローが起こる可能性があります。オーバーフローを検出するにはcheckedを使い、整数除算を避けるにはdoubleにキャストしてください。

using System;

class Program
{
    static void Main()
    {
        double d = 3.9;
        int i = (int)d;     // explicit, truncates to 3
        long l = i;          // implicit widening
        Console.WriteLine(i + ", " + l);
    }
}

よくある質問

「暗黙的変換と明示的変換」レッスンは無料ですか?

はい。「暗黙的変換と明示的変換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「暗黙的変換と明示的変換」で何を学びますか?

互換性のある型の間で安全に変換します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「暗黙的変換と明示的変換」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 値型と参照型
  2. ボックス化とボックス化解除
  3. 暗黙的変換と明示的変換
  4. Convertクラスと解析
← C# Academyに戻る