gpt4 book ai didi

C# 7.3 枚举约束 : Why can't I use the enum keyword?

转载 作者:IT王子 更新时间:2023-10-29 04:44:28 26 4
gpt4 key购买 nike

为了将泛型类型参数约束为枚举类型,我之前像这样约束它们,这是我在 C# 7.3 之前的版本中为枚举约束类型 T 的最佳方法:

void DoSomething<T>() where T : struct, IComparable, IConvertible, IFormattable

现在,C# 7.3 添加了一项新功能,可将泛型类型限制为 System.Enum。我尝试将枚举约束与 VS2017 15.7 update released today 一起使用,当我这样写时它编译成功(假设我有一个 using System; 指令):

void DoSomething<T>() where T : Enum

但是,使用 enum 关键字不起作用并导致编译器抛出以下错误(接下来还有更多错误,期待方法体,但我猜这里不值得一提):

void DoSomething<T>() where T : enum
^ error CS1031: Type expected
error CS1002: ; expected
^ error CS1001: Identifier expected
error CS1514: { expected
error CS1513: } expected

由于struct 约束适用于结构,我不明白为什么enum 在这里不适用于枚举。 enum 确实没有像 int 那样映射到 Int32 那样的实际类型,但我认为它的行为应该与 struct 约束。

我是否只是陷入了一个尚未完全实现的实验性功能陷阱,或者这是规范中故意设计的(为什么?)?

最佳答案

泛型的 struct 约束不会映射到实际类型(尽管理论上它可以映射到 ValueType )。同样,enum 并不像 stringintlong 那样清晰地映射到实际类型,它设置特殊语法来创建一类映射到整数值的符号常量;因此 public enum Stuff 而不是 public class Stuff : Enum。请注意,如果后者被实现,它会更微妙,因为它会根据继承类型更改语法,而不是根据非 class 关键字更改语法。

因此,总而言之,是的,where T : enum 并不适用,因为 enum 是关键字,而不是类型别名。如果你真的想看到它工作因为enum至少闻起来像这样的上下文中的类型别名,那就去申请吧!

编辑:对于一些历史引用,here's a question from 2008表明 Enum 不是一个有效的约束,因为它是一个特殊的类。

关于C# 7.3 枚举约束 : Why can't I use the enum keyword?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50218754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com