【问题标题】:"Class of <T> where T : Enum" not working [duplicate]“<T>类,其中T:枚举”不起作用[重复]
【发布时间】:2026-01-24 21:05:03
【问题描述】:

可能重复:
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'"

谢谢!

【问题讨论】:

  • 不可能。在这里查看解决方法:*.com/questions/79126/…
  • 顺便说一下,该规范读起来很有趣,很有启发性。每个 C# 程序员都应该熟悉它,当您对语言有疑问时,它应该是您的第一个来源。参看。 10.1.5,特别是对于这个问题。
  • @Jason:是的,C# 4 Annotated Spec 特别精彩。而且我说这不仅仅是因为我贡献了注释 - 所有 other 注释都非常有趣:)
  • @Jon Skeet:我同意,所有的注释都很有见地。
  • @Jon:有更新版本的 C# Annotated Standard 书籍吗?我找不到它。

标签: c# class templates enums


【解决方案1】:

你不能这样做,因为规范说你不能,基本上。这很烦人,但就是这样。 CLR 毫无问题地支持它。我的猜测是,当第一次设计泛型时,CLR 可能支持它,所以它在语言中也被禁止......而且 C# 团队没有'没有得到关于它的备忘录然后得到支持,或者它太迟了太包括它。代表也很烦人。

至于解决方法...看看我的Unconstrained Melody 项目。您可以自己使用相同的方法。我同时写了一个blog post,里面说的比较详细。

【讨论】:

  • 您认为此类问题有可能通过 Roslyn 解决吗?
  • @series0ne:据我所知,它不在 C# 6 的功能列表中......虽然它可能更容易做到。 (也很容易破解 Roslyn 的结帐...)
  • 我正在尝试一种方法,发现 herestring 转换为 Enum ,其中一个评论说添加 where T : struct 以使扩展方法起作用。但为什么有必要?是Enum.TryParse 的语法吗?
  • @stom: 是的——你只能调用Enum.TryParse&lt;TEnum&gt;,因为TEnum是一个值类型,因为它的约束;如果您从自己的泛型方法中调用它,则需要相同的约束来确保它是值类型。
  • @stom:此时您应该提出一个新问题,因为它与此答案实际上无关。但基本上编译器会告诉你我要告诉你的——那个约束是无效的。 (无论如何它会有什么用处?如果int 是您可以使用的唯一类型,那么它就不再是通用的了......)
【解决方案2】:

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

class A<T>
        {
            static A()
            {
                if(!typeof(T).IsEnum)
                {
                    throw new Exception();
                }
            }
        }

【讨论】:

    【解决方案3】:

    不,我不这么认为。是的,使用设计模式来解决它,让基类返回允许的类型,并且派生类可以检查它。

    HTH。

    【讨论】:

      最近更新 更多