引子

窃以为枚举就是值类型,但今天写码时有一个疑问 ,发现了个Enum

测试了下Enunenum的关系,大概是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
public class EnumTest<T> where T :Enum
{

}
public enum pl
{
aa,
bb
}
public class Test
{
public static void Main()
{
EnumTest<pl> el = new EnumTest<pl>();
}
}C

运行后发现没有报错,就感到很奇怪

enum是值类型,Enum是引用类型,泛型约束为Enum,按理说泛型实参得是Enum类本身和或者其子类
JHJ但是enum是结构体啊,结构体也可以继承吗

在这时我隐隐发现,我得改变一些想法了,于是去微软文档里找了一番。

最后是这些总结

  • Enum是抽象类,继承于System.ValueType,两者都是引用类型

  • **enum是结构体,继承于Enum**。

  • 那结构体可以实现继承喽?毕竟所有值类型都是继承于ValueType,对好像也不对,因为struct也不能继承struct

    俺的总结:struct可以继承,但又没有完全继承,可以继承是因为所有值类型都是继承于ValueTypeenum继承于Enum

    **没有完全继承是因为struct也不能继承struct**。

  • 一切由System.ValueType派生的对象都是值类型这句话就错了,Enum就是例外,只能说所有值类型都是由System.ValueType派生

    自然的,像上述泛型传参过程中enumEnum有一个装箱的过程。

    完…😭

Edit(10.12):

所以想要泛型参数约束只能是枚举就可以这样

public class FSM<T> where T : struct,Enum

Edit(10.13):

文档里看到了这句话

1
从 C# 7.3 开始,你可以在基类约束中使用 System.Enum(称为枚举约束),以指定类型参数为枚举类型。 所有枚举类型也都满足 struct 约束,此约束用于指定类型参数为不可为 null 的值类型。

所以想要泛型参数约束只能是枚举只需要约束为Enum就好了。