c# – 枚举只能命名整数,类型还是两者都不是?
有趣的枚举在C#.创建一个通用列表,用于存储您之前定义的一些枚举,并在其中添加几个项目.用foreach或GetEnumerator< T>()迭代,但是指定一些其他枚举,然后是原始的,看看会发生什么.我期待着InvalidCastException或类似的东西,但它完美的工作:).
为了说明,我们来看一个简单的控制台应用程序,并在其中创建两个枚举:汽车和动物: public enum Cars { Honda = 0,Toyota = 1,Chevrolet = 2 } public enum Animals { Dog = 0,Cat = 1,Tiger = 2 } 并在主要方法中做到这一点: public static void Main() { List<Cars> cars = new List<Cars>(); List<Animals> animals = new List<Animals>(); cars.Add(Cars.Chevrolet); cars.Add(Cars.Honda); cars.Add(Cars.Toyota); foreach (Animals isItACar in cars) { Console.WriteLine(isItACar.ToString()); } Console.ReadLine(); } 它将在控制台中打印:
为什么会这样呢?我的第一个猜测是,枚举实际上并不是一个类型,它只是和int,但这不是真的:如果我们写: Console.WriteLine(Animals.Tiger.GetType()全名.); 解决方法
枚举类型是不同的,但是你被一个隐含的表达式所困惑.
让我们重写一下你的循环: public static void Main() { List<Cars> cars = new List<Cars>(); List<Animals> animals = new List<Animals>(); cars.Add(Cars.Chevrolet); cars.Add(Cars.Honda); cars.Add(Cars.Toyota); foreach (Cars value in cars) { // This time the cast is explicit. Animals isItACar = (Animals) value; Console.WriteLine(isItACar.ToString()); } Console.ReadLine(); } 现在这个结果让你感到惊讶吗?希望不是,除了可以从一个枚举到另一个枚举的事实.这只是您原始代码正在做的更为明确的版本. 事实上,每个foreach循环中都有一个隐式的转换(尽管通常是一个no-op)是大多数开发人员会发现混乱的一点,我认为. 从C#3.0规范的8.8.4节:
foreach (V v in x) embedded-statement
{ E e = ((C)(x)).GetEnumerator(); try { V v; while (e.MoveNext()) { v = (V)(T)e.Current; embedded-statement } } finally { ... // Dispose e } } 枚举转换本身包含在6.2.2节中:
>从sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double或decimal到任何枚举类型.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |