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中使用了程序员计算器:)