Gunix
Just do Coding

Q:在C#里,我们如何表达枚举类型 

A:你可以使用enum关键字(keyword)来声明一个枚举类型(enum type):


Q:枚举类型是值类型(value type)还是引用类型(reference type) 

A:枚举类型都是值类型。


Q:System.Enum是枚举类型么 

A:不是。


Q:System.Enum与枚举类型(enum type)有什么关系 

A:System.Enum是一个抽象类(abstract class),所有枚举类型都直接继承自它,当然也同时继承了它的所有成员。


Q:那么System.Enum属于引用类型啦 

A:是的。


Q:既然System.Enum是引用类型,而枚举类型又是直接继承自System.Enum的,那为什么枚举类型却不是引用类型

A:这种继承关系是隐式的并由编译器负责展开,上面Code #1的Alignment枚举被展开后的IL代码如下:

从声明中,你可以看到Aligment的确是继承自System.Enum的,只是你不能在C#里显式声明这种继承关系。


Q:但你好像没有回答为什么枚举类型继承自一个引用类型后,却还是值类型!

A:你知道,所有的值类型都是System.ValueType的后代,枚举类型也不例外,枚举类型直接继承自System.Enum,而System.Enum却又直接继承自System.ValueType的,所以,枚举类型也是System.ValueType的后代。


Q:慢着!从System.ValueType派生出来的类型不都应该是值类型吗 为什么System.Enum会是引用类型

A:正确的说法应该是“值类型都是System.ValueType的后代”,但System.ValueType的后代不全是值类型,System.Enum就是唯一的特例!在System.ValueType的所有后代中,除了System.Enum之外其它都是值类型。事实上,我们可以在.NET的源代码中找到System.Enum的声明:

posted on 2010-04-22 11:11  Gunix  阅读(226)  评论(0)    收藏  举报