88

構築している流暢なテストフレームワークで使用する数値型の拡張メソッドを作成しようとしています。基本的に、私はこれをしたいです:

public static ShouldBeGreaterThan<T>(this T actual, T expected, string message)
    where T : int || T: double || etc...

それはまた一致し、おそらく私が忘れている何か他のものになるので、ちょうどwhere T : structしません。数値タイプのみに一致させるためにできることはありますか?(具体的には、and演算子を実装する型なので、それらを比較できます。..これが日付も一致していることを意味する場合、それは実際には重要ではありません。拡張子は期待どおりに機能します。)stringbool><

4

6 に答える 6

63

この場合、ジェネリックをIComparableインターフェースに制限します。これにより、メソッドにアクセスできるようになります。CompareToこれは、このインターフェースで質問に答えることができるためですShouldBeGreaterThan

数値型はそのインターフェースを実装し、文字列でも機能するという事実はそれほど気にしないはずです。

于 2010-07-25T14:48:52.567 に答える
54
where T : struct, 
          IComparable, 
          IComparable<T>, 
          IConvertible, 
          IEquatable<T>, 
          IFormattable

これは、数値制約に最も近いものです。すべての数値型はこれらの5つのインターフェイスを実装しますが、IFormattableはboolによって実装されておらず、文字列は参照型であるため、適用できません。

これらを実装する他のいくつかのものがあります-たとえば、DateTimeなので、実際には必要ではありませんが、不要な多くのインスタンス化を防ぎます。

于 2010-07-25T15:21:43.537 に答える
20
public static bool IsGreaterThan<T>(this T actual, T comp) where T : IComparable<T>
{
    return actual.CompareTo(comp) > 0;
}

必要に応じて、構造体制約を追加することもできます。

于 2010-07-25T14:55:37.230 に答える
9

INumericフィルタとして使用するような一般的なものはないため、数値だけに限定することは困難です。実際、ここでの最も簡単なアプローチは、制約を主張せComparer<T>.Default.Compare、メソッド内で使用することだと思います。

この組み込み型は、ジェネリックIComparable<T>と非ジェネリックの両方IComparableをサポートし、ref型、値型、およびを介したリフトされた使用法をサポートしますNullable<T>

演算子の完全な使用法については、 MiscUtilのOperatorクラスなどを参照してください。これは、(インターフェイスではなく)演算子を本当にGreaterThan使用したい場合に役立つことがあります。また、などの他のオペレーターへのアクセスも提供します。Add

于 2010-07-25T15:10:09.477 に答える
5

Stackoverflowには、この種の質問が散らばっています。 この検索を見てください。C#は、数値によって制約されるジェネリック型を定義する方法をサポートしていません。残念ながら、最善の策は、すべてのオブジェクトにextensionメソッドを実装し、型に基づいて切り替えを行うか、int、double、floatなどのメソッドのセットを作成することです。

于 2010-07-25T14:44:38.933 に答える
0

この回避策が役立つ場合があります。ポリシーを使用した回避策。コンパイル時の安全性を提供します。

于 2011-02-07T12:44:37.950 に答える