枚举,是列举的意思,即区别每一个个体,尽管这(被枚举出来的)一系列个体是同一类别的性质,但个体之间有差异,其差异就用不同的数值区别出来,这个用于区别的数值类型其实是任意的,既可以是整数,也可以是浮点数,但重点是互相之间能夠区别,所以最佳的数据类型是使用整数。区别值用整数,不等于枚举中的每个元素就是整数,这是逻辑上的问题,对枚举来说,每个元素的区别值具体是什么,其实是不相干的,你设定one=1、two=2,实际上也可以设定one=2、two=10,只要one和two是不同的元素、而且它们的排序结果与需要吻合(one在two的前面),那些元素值就可以是任意的。现在,你应该明白了,当把1视为one的时候,你就是错的,在逻辑上1并不是one,one就是one,不是别的什么,可以视one为1,但1不必然是one。
正如上述,枚举只是列举,必然是有限集合,你定义中列明了集合中的具体元素,就只有那些,没有别的。1楼的代码,枚举集合中没有值为6的元素,编译可以通过,运行的结果myflag的值也为6,但是这个值并不是bits枚举集合中的,仅仅是一个整数罢了,在理论上,编译器不该让这种代码通过,能让这种代码通过是语言和编译器的缺陷。依据你的设想,six才是6,我们只能使用myflag = six这样的语句。不管是硬编码还是暗藏用法,所有使用枚举内部值的方式都是误用枚举。在C#中,枚举的机制比C/C++完善得多,在那里,输出one的结果是one字样,而不是内部编码值1。
[
本帖最后由 TonyDeng 于 2013-8-9 13:51 编辑 ]