6

型で指定する必要があるジェネリック型がありますEnum(実際には、指定されたいくつかの列挙型の 1 つですが、 で解決しますSystem.Enum)。

もちろん、コンパイラは次のようなコードには抵抗します。

class Generic<T> where T : Enum {}

「制約を特別なクラス 'System.Enum' にすることはできません」という例外があります。

これまでに思いついた唯一の解決策は、静的型初期化子を使用して型パラメーターを調べ、実際には列挙型でない場合は次のように例外をスローすることです。

class Generic<T> 
{
  static Generic()
  {
    if (typeof(T).BaseType != typeof(Enum))
      throw new Exception("Invalid Generic Argument");
  }
}

これにより、少なくとも列挙型以外のパラメーターを使用しないというランタイム セキュリティが得られます。ただし、これは少しハッキリしているように感じます。理想的にはコンパイル時の構成を使用して、これを達成するためのより良い方法はありますか?

4

4 に答える 4

6

これを行うには、 Jon Skeet の Unconstrained Melodyプロジェクトを使用できます。

Unconstrained Melody を使用すると、次のように記述できます。

class Generic<T> where T : IEnumConstraint

これは同じことを達成します。

Unconstrained Melody の詳細と使用例。

于 2013-01-04T16:16:05.637 に答える
4

残念ながら、ジェネリック クラスに渡される型がコンパイル時に列挙型であることを保証する方法はありません。次の制約のみを追加できます。

class Generic<T> where T : struct { }

すべての参照型を除外するには、ランタイム チェックが必要です。

于 2013-01-04T16:13:34.710 に答える
1

enums は IConvertible インターフェイスも実装しているため、構造体とともにそれを制約として追加できます。

class Generic<T> where T : struct, IConvertible {}
于 2013-01-04T16:19:41.813 に答える
1

構造体を使用できると思います:

class Generic<T> where T : Struct
于 2013-01-04T16:14:35.130 に答える