“<t>类,其中T:Enum”无法正常工作</t>

时间:2011-02-25 17:10:03

标签: c# class templates enums

  

可能重复:
  Create Generic method constraining T to an Enum

我们有什么理由不能在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'"

谢谢!

3 个答案:

答案 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。