C# 7.3 枚举约束:为什么我不能使用枚举关键字?
C# 7.3 Enum constraint: Why can't I use the enum keyword?
为了将泛型类型参数约束为枚举类型,我之前是这样约束它们的,这是我在 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
并不像 string
、int
或 long
那样干净地映射到实际类型,它设置了用于创建 class 的特殊语法映射到整数值的符号常量;因此 public enum Stuff
而不是 public class Stuff : Enum
。请注意,如果后者被实现,它会更加微妙,因为它会根据继承类型更改语法,而不是根据非 class
关键字更改语法。
所以,总而言之,是的,where T : enum
并不适用,因为 enum
是关键字,而不是类型别名。如果你真的想要看到它工作因为enum
至少在这些上下文中闻起来像类型别名,去请求它!
编辑:对于一些历史参考,here's a question from 2008 表明 Enum
不是有效约束,因为它是一个特殊的 class.
为了将泛型类型参数约束为枚举类型,我之前是这样约束它们的,这是我在 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
并不像 string
、int
或 long
那样干净地映射到实际类型,它设置了用于创建 class 的特殊语法映射到整数值的符号常量;因此 public enum Stuff
而不是 public class Stuff : Enum
。请注意,如果后者被实现,它会更加微妙,因为它会根据继承类型更改语法,而不是根据非 class
关键字更改语法。
所以,总而言之,是的,where T : enum
并不适用,因为 enum
是关键字,而不是类型别名。如果你真的想要看到它工作因为enum
至少在这些上下文中闻起来像类型别名,去请求它!
编辑:对于一些历史参考,here's a question from 2008 表明 Enum
不是有效约束,因为它是一个特殊的 class.