我们有什么理由不能在C#中这样做吗?而且,如果可能的话,我该怎么做类似的事情!
我想要的是什么:
public class<T> ATag where T : enum {
[Some code ..]
}
public class<T> classBase where T : enum {
public IDictionary<T, string> tags { get; set; }
}
所以,当它到了调用它的时候,我只能得到一个我的枚举值。
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'"
谢谢!
答案 0 :(得分:27)
你不能这样做,因为规范说你不能,基本上。这很烦人,但就是这样。 CLR支持它没有问题。我的猜测是,当首次设计泛型时,CLR可能不支持它,所以它在语言中也被禁止了......而且C#团队都没有得到关于它的备忘录然后得到支持,或者为时已晚也包括它。代表们也同样烦人。
至于解决方法......看看我的Unconstrained Melody项目。您可以自己使用相同的方法。我同时写了一篇blog post,详细介绍了这一点。
答案 1 :(得分:6)
这是不可能的。但如果您对运行时检查感兴趣,可以
class A<T>
{
static A()
{
if(!typeof(T).IsEnum)
{
throw new Exception();
}
}
}
答案 2 :(得分:0)
不,我不相信。是使用设计模式来绕过它,让基类返回允许的类型,派生类可以检查它。
HTH。