はじめに
今回はimplicit
とexplicit
について取り上げていこうと思います。
正直あまり見かけたことないですが、これは型変換(キャスト)のときに活躍するキーワードです。
下のコードをみてみてください。
int a = 10; float b = a; // 暗黙的なキャスト float c = (float)a; // 明示的なキャスト
int <-> float
のキャストは既に.NET
により定義されているので可能ですが、基本的には自分で定義した型(ユーザー定義型)ではできません。
これを可能にするのが変換演算子implicit
・explicit
になります。
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 } }
さいごに
最初にこれらのキーワードをみたときになんだこれとビックリしてしまいましたが、中身はかなりシンプルで安心しました。
普段はあまり見かけない?とは思いますが、是非うまく活用してみてください。