鉴于此代码:
public enum Enum1
{
ONE,
TWO
}
public enum Enum2
{
A,
B
}
此代码返回ONE,TWO:
foreach (Enum1 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
但是这段代码不是失败(因为Enum2 e
与typeof(Enum1)
一起使用),而是返回A,B:
foreach (Enum2 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
为什么?
答案 0 :(得分:9)
因为在封面下,枚举只是整数 - 第二个返回Enum1
的值,但实际上这些值只是0
和1
。当您将这些值转换为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
。