減算演算子などの演算子をオーバーロードした型のみを受け入れるジェネリックメソッドが必要な場合はどうすればよいですか。インターフェイスを制約として使用しようとしましたが、インターフェイスで演算子のオーバーロードを設定できません。
これを達成するための最良の方法は何ですか?
減算演算子などの演算子をオーバーロードした型のみを受け入れるジェネリックメソッドが必要な場合はどうすればよいですか。インターフェイスを制約として使用しようとしましたが、インターフェイスで演算子のオーバーロードを設定できません。
これを達成するための最良の方法は何ですか?
すぐに答えはありません。演算子は静的であり、制約で表現することはできません。また、既存のプリミティブは特定のインターフェイスを実装していません(より大きい/より小さいをエミュレートするために使用できるIComparable [<T>]とは対照的です)。
でも; それを機能させたいだけなら、.NET3.5にはいくつかのオプションがあります...
ここに、ジェネリックスを使用した演算子への効率的かつ簡単なアクセスを可能にするライブラリをまとめました。
T result = Operator.Add(first, second); // implicit <T>; here
MiscUtilの一部としてダウンロードできます
さらに、C#4.0では、これは次の方法で可能になりますdynamic
。
static T Add<T>(T x, T y) {
dynamic dx = x, dy = y;
return dx + dy;
}
私は(ある時点で).NET 2.0バージョンも持っていましたが、それはあまりテストされていません。もう1つのオプションは、次のようなインターフェイスを作成することです。
interface ICalc<T>
{
T Add(T,T)()
T Subtract(T,T)()
}
などですが、すべてのメソッドを通過する必要があり、ICalc<T>;
面倒になります。
IL は実際にこれをうまく処理できることがわかりました。元。
ldarg.0
ldarg.1
add
ret
ジェネリック メソッドでコンパイルされたコードは、プリミティブ型が指定されている限り正常に実行されます。これを拡張して、非プリミティブ型で演算子関数を呼び出すことができる場合があります。
ここを参照してください。