Enum.GetValues(typeof(....))没有返回正确的枚举值

Joh*_*oDo 6 c# enums

鉴于此代码:

public enum Enum1
{
    ONE,
    TWO
}

public enum Enum2
{
    A,
    B
}
Run Code Online (Sandbox Code Playgroud)

此代码返回ONE,TWO:

foreach (Enum1 e in Enum.GetValues(typeof(Enum1)))
{
  Console.WriteLine(e);
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码,而不是失败(因为Enum2 e与之一起使用typeof(Enum1)),返回A,B:

foreach (Enum2 e in Enum.GetValues(typeof(Enum1)))
{
    Console.WriteLine(e);
}
Run Code Online (Sandbox Code Playgroud)

这是为什么?

Jus*_*tin 9

因为在封面下Enums只是整数 - 第二个返回值Enum1,但实际上这些值只是01.当您将这些值转换为类型时,Enum2这些值仍然有效并且对应于值"A"和"B".

  • @JohnDoDo:编译器没有捕获它,因为"foreach(Enum2 e ..."执行**显式**转换 - 有效的转换 - 从集合类型到循环变量类型.它是合法的*cast*`(Enum2)enum1`,因此用*foreach*隐式地做同样的事情是合法的.记住,foreach是在泛型之前发明的;如果你有一个字符串的ArrayList,你希望能够说'foreach(myArrayList中的字符串s)`并自动进行显式转换. (6认同)

Chr*_*ain 8

因为枚举的值是隐式整数:

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

public enum Enum2
{
    A = 0,
    B = 1
}
Run Code Online (Sandbox Code Playgroud)

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

public enum Enum1
{
    ONE = 0,
    TWO = 1,
    THREE = 2,
}
Run Code Online (Sandbox Code Playgroud)

......然后会的 失败 不返回"A,B",因为Enum2中没有值为整数值2