2009年9月7日月曜日

enum を型制約する

Generic クラスに enum の型制約をつけたところ、

class SomeGeneric<T> where T : enum
エラー : 型が必要です。
と、コンパイルエラーが出てしまいます。
それならと、System.Enum に変更してみました。

class SomeGeneric<T> where T : System.Enum
エラー : 制約は特殊クラス 'System.Enum' にはなれません。
これもだめだそうです。そうですか。残念です。

他にも System.Array 型、 System.Delegate 型、 System.ValueType 型で型制約することはできないようです。

参考
http://msdn.microsoft.com/ja-jp/library/56b2hk61.aspx
コンパイラ エラー CS0702


仕方がないので、System.Enum の定義にある IConvertible を型制約にして
とりあえず int 型にできればいいやという発想。


// System.Enum の定義
public abstract class Enum
    : ValueType, IComparable, IFormattable, IConvertible

class SomeGeneric where T : IConvertible
{
    protected T item = default(T);
    
    // enum : long で列挙されると困るので virtual 宣言
    public virtual T Item
    {
        get
        {
            return item;
        }
        set
        {
            if (item.ToInt32(null) != value.ToInt32(null))
            {
                // Do something
            }
        }
    }
}

0 件のコメント:

コメントを投稿