【C#】ジェネリックとは その1

コードを書いていると、「あぁ、これは他のもにも使いまわせそうなのになぁ…」と思うことがあります。
ただ、C#はタイプセーフ言語であり、基本的には「型ごとに」コードを書く必要があります。

例:

int Add(int a, int b)
{
  return a + b;
}
long Add(long a, long b)
{
  return a + b;
}

上の2件の場合、intの方だけではlongを引数に入れることができませんし、longの方は暗黙的キャストでintを引数に入れることはできますが、戻り値がlong型のため、結果取得時にint型への明示的キャストが必要になります。
これだけ単純なものでもそうですので、もっと複雑な仕組みを含むものの場合はもっと面倒なことになります。

そこで出番になるのが「ジェネリック」です。
ジェネリックは「仮の型」としてコードを記載し、実際に使用するときにその型を指定する、という使い方ができます。

GenericType Add<GenericType> (GenericType a, GenericType b)
{
  return a + b;
}

int result1 = Add<int>(a, b);
long result2 = Add<long>(a, b);

この様に記載すれば、GenericTypeがintでもlongでも同様に使用することができます。
(なお、実際には<int>, <long>の部分は型推定可能なので省略可能です。)
よくジェネリックでは<T>と書かれるので勘違いされる場合がありますが、「仮の型」の名称は自由に設定できます。(作法やローカルルールは除く)
正直、<T>だと分かりにくいこともあると思うので、私は何らかの名前を付けることが多いです。

なお、上記コードは簡便の為に書いたため、実際に使おうとするとエラーが出ます。「a+b」が仮の型の中身次第では成立しないためです。
この辺りは仮の型に制約を付けることでパスできますので、その辺りについては次回に掲載するようにします。

この記事が気に入ったらサポートをしてみませんか?