C# 7.3 枚举约束:为什么我不能使用枚举关键字?



为了将泛型类型参数约束为枚举类型,我之前像这样约束它们,这是我在 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不像stringintlong那样干净地映射到实际类型,但它设置了特殊的语法来创建映射到整数值的符号常量类;因此public enum Stuff而不是public class Stuff : Enum.请注意,如果实现后者,它将更加微妙,因为它会基于继承的类型更改语法,而不是基于非class关键字更改语法。

所以,总之,是的,where T : enum不起作用,enum因为它是一个关键字,而不是类型别名。如果你真的想看到它工作,因为至少enum在这些上下文中闻起来像类型别名,那就去请求它吧!

编辑:对于一些历史参考,这里有一个2008年的问题,表明Enum不是一个有效的约束,因为它是一个特殊的类。

最新更新