C# C中整数到枚举的转换#
我有一个C# C中整数到枚举的转换#,c#,enums,C#,Enums,我有一个enum类型,每个enum都有一些不连续的值。当我尝试将int值强制转换为enum类型时,它返回多个enum值,并用|运算符分隔。有人能解释一下它是如何铸造的吗 enum EnumTest { Test1 = 0, Test2 = 1, Test3 = 1 << 1, Test4 = 1 << 2, Test5 = 1 << 12, Test6 = 1 << 13, Test7 = 1
enum
类型,每个enum
都有一些不连续的值。当我尝试将int
值强制转换为enum
类型时,它返回多个enum
值,并用|
运算符分隔。有人能解释一下它是如何铸造的吗
enum EnumTest
{
Test1 = 0,
Test2 = 1,
Test3 = 1 << 1,
Test4 = 1 << 2,
Test5 = 1 << 12,
Test6 = 1 << 13,
Test7 = 1 << 20,
Test8 = 1 << 22,
Test9 = 1 << 23,
Test10 = 1 << 24,
Test11 = 1 << 25,
Test12 = 1 << 14,
Test13 = 1 << 15,
Test14 = 1 << 16,
Test15 = 1 << 25,
Test16 = 1 << 17,
Test17 = 1 << 18,
Test18 = 1 << 19,
Test19 = 1 << 21,
Test20 = 1 << 26
}
public void method1()
{
int number=67239937;
EnumTest e = (EnumTest)number; //output: Test2|Test16|Test20
}
enum枚举测试
{
Test1=0,
Test2=1,
Test3=1假设您的enum
是:
enum E {
A = 1
B = 2
C = 4
D = 8
}
如果将每个值转换为二进制值,则会得到:
A = 0001
B = 0010
C = 0100
D = 1000
现在让我们假设您尝试将二进制的12
,1100
转换为这个enum
:
E enumTest = (E)12;
它将输出C|D
|
作为OR运算符,C | D
表示0100或1000
,这表示十进制的1100
,或12
在您的例子中,它只是试图找到哪个enum
组合等于67239937
。它被转换为二进制,即100000000000000000000001
。然后转换为Test2 | Test16 | Test20
或1(1假设您的enum
是:
enum E {
A = 1
B = 2
C = 4
D = 8
}
如果将每个值转换为二进制值,则会得到:
A = 0001
B = 0010
C = 0100
D = 1000
现在让我们假设您尝试将二进制的12
,1100
转换为这个enum
:
E enumTest = (E)12;
它将输出C|D
|
作为OR运算符,C | D
表示0100或1000
,这表示十进制的1100
,或12
在您的例子中,它只是试图找到哪个enum
组合等于67239937
。它被转换为二进制,即1000000000000000000001
。然后转换为Test2 | Test16 | Test20
或1|(1)这个问题不是直接的骗局,但目前公认的答案涵盖了你的问题。同样相关的是:“逻辑”顺便说一句,强制转换涉及的内容非常简单——没有逻辑。e
将值67239937
隐藏起来。编译器不关心枚举标记的实际映射——枚举实际上只是修饰的整数。只有当值被其他代码段解释时,标记才会发挥作用。The问题不是直接的欺骗,但目前公认的答案涵盖了你的问题。同样相关的是:“逻辑”顺便说一句,强制转换涉及的内容非常简单——没有逻辑。e
将值67239937
隐藏起来。编译器不关心到枚举标记的实际映射——枚举实际上只是修饰的整数。当值被其他代码段解释时,标记才发挥作用。67239937
是100000001000000000000001
,因此当您查看它们的二进制值时,它将是Test2 | Test16 | Test20
。感谢您的确认,我不想进行计算:)我只是在Windows中使用了程序员计算器:)二进制中的67239937
是100000001000000000000001
,因此当您查看它们的二进制值时,它将是Test2 | Test16 | Test20
。感谢您的确认,我不想进行计算:)我只是在Windows中使用了程序员计算器:)