我们知道类型包括两大类:枚举 和 结构(包括了 int double float decimal 等简单类型),他们也都继承于valueType,但是并非所有继承于valueType的类型就一定是值类型 ,这个唯一特例就是System.Enum,这是一张继承关系图
 

所有的枚举类型都继承System.Enum,实现System.Enum所有方法。父类还是引用类型
继承自他的子类确实值类型,那么这个System.Enum和valueType一样很特殊。
现在只能简单说说枚举类型和System.Enum有什么区别:枚举类型是值类型,在栈区分配空间,它也是一种类 却不能被继承(一会从IL看出原因)。Enum 是引用类型 在堆区分配空间,它本事不是枚举类型 它却封装了操作枚举类型的方法。比如          Enum.GetName();
Enum.GetValues();
Enum.GetUnderlyingType();
现在我们声明一个枚举:
    enum MyEnum
    {
        first,
        second=101,
        third
    }
编译后的IL:

.class private auto ansi sealed MyEnum
extends [mscorlib]System.Enum
{
.field public static literal valuetype ConsoleApplication6.MyEnum first = int32(0)
.field public static literal valuetype ConsoleApplication6.MyEnum second = int32(0x65)
.field public static literal valuetype ConsoleApplication6.MyEnum third = int32(0x66)
.field public specialname rtspecialname int32 value__

}
我们看到“class”“sealed”就知道他是个不能继承的类,
这里为什么会有一个”private“我就不清楚了
大概是编译器的一种约定吧,应该是internal类型,
或许是编译器级别”private“有不同含义,
 如果定义为public的
枚举 IL也是public。 然后我们看到
extends [mscorlib]System.Enum
说明继承自Enum
 [mscorlib]是包括Enum 类的.dll文件名

”first“是 共有的 静态的 它的类型是 MyEnum ,
由于上面我没有给他值
这里编译器就给了他默认的 INT32类型的 0,而定义时候我给了second 101的值
这里编译器给了他十六进制表示的65转十进制就是101,
”third“也没赋值 系统默认 前一个 值+1给他。

也可以看出枚举的本质就是几个静态常量集合。

 
上述属个人浅薄见识,不对之处请指正。
(未完待续..............................)