C#のジェネリックスの型パラメータの制約には以下の種類がある。
- ベースクラス(1つだけ)
- インターフェイス(複数可)
- クラスまたは構造体
- パラメータのないコンストラクタ
この制約だけでは、パラメータが特定のメソッドを持つこと、といった制約を行うことはできない(インターフェイスを使えばメソッド単位の制約も実現できるが、実装が面倒)。
しかし、デリゲートのシグネチャを利用すると、ジェネリッククラスが必要とするメソッドを指定することができる。
public static class Example
{
public static T Add<T>(T left, T right, Func<T, T, T> AddFunc) =>
AddFunc(left, right);
}
このAdd()
メソッドは以下のように利用できる。
int a = 6;
int b = 7;
int sum = Example.Add(a, b, (x, y) => x + y);