私の答えがうまくいかないように思われる場合は、お気軽にもっと明確にしてください。
少なくとも、C# 言語の演算子には一般的な制約はありません。Jon Skeet がUnconstrained Melodyで証明したように、制約は実際には CLR 自体で完全に有効である可能性があります。
制約でできる最善のことは、必要なアクションを公開するインターフェース/カスタム クラスを提供することです。プリミティブを提供することはできませんが (implicit
おそらく演算子も実装しない限り)、少なくとも数学部分の汎用コードを作成できます。
ジェネリック制約を使用すると、コンパイラは最小公分母 (制約または不足によって指定) に基づいて使用可能なメンバーを推測できます。ほとんどの場合、ジェネリックは制約がないため、object
セマンティクスのみが提供されます。
または、制約の使用を避け、ジェネリック変数を一時
的dynamic
に格納するために使用してから、関連する演算子があることを (ダックタイピングによって) 仮定します。
class Program
{
static void Main(string[] args)
{
var result = Add<int, long, float>(1, 2);
Console.WriteLine(result); // 3
Console.WriteLine(result.GetType().FullName); // System.Single
Console.Read();
}
static T3 Add<T1, T2, T3>(T1 left, T2 right)
{
dynamic d1 = left;
dynamic d2 = right;
return (T3)(d1 + d2);
}
}
これには DLR が関係し、特にパフォーマンスが重要な計算を行う場合は、パフォーマンスのオーバーヘッドが発生します (正確な数値はわかりません)。
「同じジェネリック型を複数回宣言する」という意味がわかりませんが、これは機能します。
class Tuple<T1, T2> // etc.
var myTuple = new Tuple<int, int>(1, 2);