为了将一个通用类型参数限制为枚举类型,我以前会像这样进行约束,这是在 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
约束一样运作。
我是不是掉进了一个还没有完全实现的实验性功能陷阱里,或者这是在规范中故意这样做的(为什么)?
string
是String
类型的别名,但是对于enum
关键字和Enum
类型并非如此。 - user47589struct
约束并不是特定类型的别名,但是它是可能的。 - Raystruct
用于值类型,不仅限于struct
,类似于所有引用类型的class
。 - Mrinal Kambojenum
也应该这样做。关于你的链接:使用 C# 7.3,现在使用Enum
(而不是关键字enum
)将是更好的解决方案。问题只是为什么这个关键字目前不能工作。 - Ray