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

时间:2012-02-17 16:10:02

标签: c# enums

鉴于此代码:

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);
}

为什么?

7 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分: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

答案 2 :(得分: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;

答案 3 :(得分:2)

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

答案 4 :(得分:1)

这里有来自Enum1的隐式演员 - > int和int - > Enum2。

答案 5 :(得分:1)

我猜想像Jon Skeet这样的人可以来这里并完全解释发生了什么比我更好,但这段代码:

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

...将所有Enum1值视为Enum2类型。

由于enum数据类型与int数据类型类似,因此Enum1中的数值将用于索引Enum2

答案 6 :(得分:0)

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

然后,您的第二个foreach会明确地将Enum.GetValues(typeof(Enum1))的结果投射到Enum2