引子
窃以为枚举就是值类型,但今天写码时有一个疑问 ,发现了个Enum类
测试了下Enun和enum的关系,大概是这样
1 | using System; |
运行后发现没有报错,就感到很奇怪
enum是值类型,Enum是引用类型,泛型约束为Enum,按理说泛型实参得是Enum类本身和或者其子类
JHJ但是enum是结构体啊,结构体也可以继承吗
在这时我隐隐发现,我得改变一些想法了,于是去微软文档里找了一番。
最后是这些总结
Enum是抽象类,继承于System.ValueType,两者都是引用类型。**
enum是结构体,继承于Enum**。那结构体可以实现继承喽?毕竟所有值类型都是继承于
ValueType,对好像也不对,因为struct也不能继承struct俺的总结:
struct可以继承,但又没有完全继承,可以继承是因为所有值类型都是继承于ValueType,enum继承于Enum。**没有完全继承是因为
struct也不能继承struct**。一切由
System.ValueType派生的对象都是值类型这句话就错了,Enum就是例外,只能说所有值类型都是由System.ValueType派生。自然的,像上述泛型传参过程中
enum到Enum有一个装箱的过程。完…😭
Edit(10.12):
所以想要泛型参数约束只能是枚举就可以这样
public class FSM<T> where T : struct,Enum
Edit(10.13):
文档里看到了这句话
1 | 从 C# 7.3 开始,你可以在基类约束中使用 System.Enum(称为枚举约束),以指定类型参数为枚举类型。 所有枚举类型也都满足 struct 约束,此约束用于指定类型参数为不可为 null 的值类型。 |
所以想要泛型参数约束只能是枚举只需要约束为Enum就好了。