web-dev-qa-db-ja.com

プリミティブ型に対するジェネリック型の制限を定義する方法は?

私はジェネリック型で次のメソッドを持っています:

T GetValue<T>();

Tをint、string、floatなどのプリミティブ型に制限しますが、クラス型は制限しません。私はこのようなクラスタイプのジェネリックを定義できることを知っています:

C GetObject<C>() where C: class;

プリミティブ型が可能かどうか、もし可能ならどうなるかはわかりません。

60
David.Chu.ca

これを使用して、値タイプに制限できます。

where C: struct

文字列にも言及します。残念ながら、文字列は値型ではないため許可されません。

45
BFree

実際、これは特定の範囲で仕事をします:

public T Object<T>() where T :
   struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>

数値型に制限するには、 ValueType クラス用に定義された次のサンプルのいくつかの有用なヒントを取得できます。

17
Deko

探しているものは次のとおりです。

T GetObject<T>() where T : struct;
14
Joshua Belden

そのセットに完全に一致する一般的な制約はありません。実際にやりたいことは何ですか?たとえば、静的なctorなどの実行時チェックを使用してハックできます(ジェネリック型の場合-ジェネリックメソッドではそれほど簡単ではありません)...

しかしながら;私がこれを見るほとんどの場合、それは人々が次のいずれかを望んでいるからです。

  • アイテムが等しいかどうかを確認できるようにするため:EqualityComparer<T>.Default
  • アイテムを比較/ソートできるようにするには:Comparer<T>.Default
  • 算術演算を実行できるようにする場合:この場合、 MiscUtil汎用演算子 のサポートを使用します
10
Marc Gravell

メソッドで実際に何をしようとしていますか? IComparableまたは他のインターフェイスを実装するために実際にCが必要になる可能性があります。その場合、次のようなものが必要です

T GetObject<T> where T: IComparable
7
David McEwing