关于c#:“< T>类

“Class of <T> where T : Enum” not working

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Create Generic method constraining T to an Enum

有什么理由我们不能在C中这样做吗?如果可能的话,我怎么做类似的事情呢?

我想要什么:

1
2
3
4
5
6
7
public class<T> ATag where T : enum {
    [Some code ..]
}

public class<T> classBase where T : enum {
    public IDictionary<T, string> tags { get; set; }
}

所以,到了调用它的时候,我只能得到一个枚举值。

1
2
3
4
5
6
7
8
9
10
public class AClassUsingTag : classBase<PossibleTags> {
    public void AMethod(){
         this.tags.Add(PossibleTags.Tag1,"Hello World!");
         this.tags.Add(PossibleTags.Tag2,"Hello Android!");
    }
}

public enum PossibleTags {
    Tag1, Tag2, Tag3
}

错误消息:"Constraint cannot be special class 'System.Enum'"

谢谢您!


你不能这样做,因为基本上规格说明你不能。这很烦人,但就是这样。clr毫无问题地支持它。我的猜测是,当第一次设计泛型时,clr可能不支持它,所以在语言中也被禁止了…或者是C小组当时没有收到关于支持它的备忘录,或者是包含它太晚了。代表们也同样恼人。

至于解决方法…看看我的无约束旋律计划。你自己也可以用同样的方法。我同时写了一篇博文,更详细。


这是不可能的。但是如果您对运行时检查感兴趣,可以

1
2
3
4
5
6
7
8
9
10
class A<T>
        {
            static A()
            {
                if(!typeof(T).IsEnum)
                {
                    throw new Exception();
                }
            }
        }


不,我不相信。是的,使用设计模式绕过它,让基类返回允许的类型,派生类可以检查它。

Hth.