2012-02-17 122 views
6

鉴于此代码:Enum.GetValues(typeof运算(....))不返回正确的枚举值

public enum Enum1 
{ 
    ONE, 
    TWO 
} 

public enum Enum2 
{ 
    A, 
    B 
} 

此代码返回ONE,TWO:

foreach (Enum1 e in Enum.GetValues(typeof(Enum1))) 
{ 
    Console.WriteLine(e); 
} 

但是这个代码,而不是失败(因为Enum2 etypeof(Enum1)使用),返回A,B:

foreach (Enum2 e in Enum.GetValues(typeof(Enum1))) 
{ 
    Console.WriteLine(e); 
} 

这是为什么?

回答

9

因为在封面下枚举只是整数 - 第二个返回值Enum1,但真正的那些值只是01。当您将这些值转换为Enum2类型时,这些值仍然有效并对应于值“A”和“B”。

+1

当然他们做...愚蠢的我!我忘记了在C#中枚举实际上是奇特的整数。我更习惯于Java的枚举,它们是完全成熟的类。悲伤的是,编译器没有抓住它,虽然... – JohnDoDo 2012-02-17 16:16:45

+6

@JohnDoDo:编译器没有抓住它,因为“foreach(Enum2 e ...”做**明确的**转换 - 一个演员,有效地 - 从集合类型为循环变量类型,它对* cast *'(Enum2)enum1'是合法的,因此用* foreach *隐式地做同样的事情是合法的。记住,foreach是在泛型之前发明的;如果你有一个ArrayList的字符串,你希望能够说'foreach(myArrayList中的字符串s)'并且自动进行显式转换 – 2012-02-17 16:42:47

3

当您使用Enum.GetValues()时,它将返回基础值。当您使用foreach(Type...)时,它会转换为枚举类型。因此,虽然它们可能不是相同的枚举,但它们具有相同的基础值,这些值不会造成问题。

因为你的枚举值是隐含什么是发生在大约相当于该

int value = Enum.GetValues(typeof(Enum2))[1]; // this isn't valid code, it's more simplified 
Enum1 casted = (Enum1)value; 
8

的整数:

public enum Enum1 
{ 
    ONE = 0, 
    TWO = 1 
} 

public enum Enum2 
{ 
    A = 0, 
    B = 1 
} 

Enum1的值被隐式转换为整数,然后将值的Enum2。如果你重新定义Enum1如下...

public enum Enum1 
{ 
    ONE = 0, 
    TWO = 1, 
    THREE = 2, 
} 

...那就失败不会返回“A,B”,因为在Enum2为整数值2

+1

Enum值从0开始,实际上打印出'A,B,2'而不是失败 - 看到[在C#中枚举enums枚举](http://stackoverflow.com/questions/1758321/casting-ints-to-enums-in-c-sharp) – Justin 2012-02-17 16:17:43

+0

@Justin修复,谢谢。 – 2012-02-17 16:19:54

1

有没有价值是从Enum1 - > int和int - > Enum2的隐式转换。

0

其原因是枚举可以隐式转换为System.Int(假设它们是int枚举,默认情况下它们是int枚举)。

您的第二个foreach然后明确地将Enum.GetValues(typeof(Enum1))的结果转换为Enum2

2

Enum.GetValues(typeof(Enum1))返回{0,1}和foreach将在此范围内列举

1

我猜有人像乔恩斯基特可以来这里完全解释正在发生的事情比我好,但是这个代码:

foreach (Enum2 e in Enum.GetValues(typeof(Enum1))) 
{ 
    Console.WriteLine(e); 
} 

...将您所有的Enum1值看作Enum2类型。

由于enum数据类型与数据类型int相似,因此您使用Enum1的数值来索引Enum2