はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】変換演算子(implicitとexplicit)を軽くまとめてみる

はじめに

今回はimplicitexplicitについて取り上げていこうと思います。

正直あまり見かけたことないですが、これは型変換(キャスト)のときに活躍するキーワードです。

下のコードをみてみてください。

int a = 10;
float b = a;            // 暗黙的なキャスト
float c = (float)a;     // 明示的なキャスト

int <-> floatのキャストは既に.NETにより定義されているので可能ですが、基本的には自分で定義した型(ユーザー定義型)ではできません。

これを可能にするのが変換演算子implicitexplicitになります。
docs.microsoft.com


実際に使い方をみていきましょう。

暗黙的なキャスト

冒頭で紹介したfloat b = a;のような暗黙的なキャストを定義するにはimplicitを用います

public class Test
{
    public int X { get; }

    // コンストラクタ
    public Test(int x)
        => X = x;

    // 暗黙的な型変換  例. int a = test;
    public static implicit operator int(Test test)
        => test.X;

    // 暗黙的な型変換  例. Test test = intValue;
    public static implicit operator Test(int x)
        => new Test(x);
}

これを使ってみるとこんな感じ。

public class Test2
{
    static void Main(string[] args)
    {
        Test test = new Test(7);

        int a = test;
        Console.WriteLine(a);       // 7

        int intValue = 14;
        test = intValue;
        Console.WriteLine(test.X);  // 14
    }
}

明示的なキャスト

次にfloat c = (float)a;のような明示的なキャストを定義するにはexplicitを用います

public class Test
{
    public int X { get; }

    // コンストラクタ
    public Test(int x)
        => X = x;

    // 明示的な型変換  例. (int)test;
    public static explicit operator int(Test test)
        => test.X;

    // 明示的な型変換  例. (Test)intValue;
    public static explicit operator Test(int x)
        => new Test(x);
}


これを使ってみるとこんな感じ。

public class Test2
{
    static void Main(string[] args)
    {
        Test test = new Test(7);

        int a = (int)test;
        Console.WriteLine(a);       // 7

        int intValue = 14;
        test = (Test)intValue;
        Console.WriteLine(test.X);  // 14
    }
}

さいごに

最初にこれらのキーワードをみたときになんだこれとビックリしてしまいましたが、中身はかなりシンプルで安心しました。

普段はあまり見かけない?とは思いますが、是非うまく活用してみてください。