为了将泛型类型参数约束为枚举类型,我之前像这样约束它们,这是我在 C# 7.3 之前约束枚举类型 T 的最佳方法:
void DoSomething<T>() where T : struct, IComparable, IConvertible, IFormattable
现在,C# 7.3 添加了一项新功能,用于将泛型类型约束为System.Enum
。 我尝试在今天发布的VS2017 15.7更新中使用枚举约束,当我这样编写时,它编译成功(鉴于我有一个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
不像string
、int
或long
那样干净地映射到实际类型,但它设置了特殊的语法来创建映射到整数值的符号常量类;因此public enum Stuff
而不是public class Stuff : Enum
.请注意,如果实现后者,它将更加微妙,因为它会基于继承的类型更改语法,而不是基于非class
关键字更改语法。
所以,总之,是的,where T : enum
不起作用,enum
因为它是一个关键字,而不是类型别名。如果你真的想看到它工作,因为至少enum
在这些上下文中闻起来像类型别名,那就去请求它吧!
编辑:对于一些历史参考,这里有一个2008年的问题,表明Enum
不是一个有效的约束,因为它是一个特殊的类。