【问题标题】:Integer to enum casting in C# [duplicate]整数到 C# 中的枚举转换 [重复]
【发布时间】:2017-10-08 21:27:12
【问题描述】:

我有一个 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
}

【问题讨论】:

  • 该问题不是直接欺骗,但当前接受的答案涵盖了您的问题。
  • 演员阵容所涉及的“逻辑”,顺便说一句,很简单——没有逻辑。 e 在封面下具有 67239937 的值。枚举标签的实际映射与编译器无关——枚举实际上只是整数。当值被其他代码片段解释时,标签开始发挥作用。

标签: c# enums


【解决方案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

在您的情况下,它只是试图找出哪个enum 组合等于67239937。这将转换为二进制为100000000100000000000000001。然后转换为Test2|Test16|Test20 或1|(1 &lt;&lt; 17)|(1 &lt;&lt; 26)。

【讨论】:

  • 67239937 在二进制中是 100000000100000000000000001 所以当你查看它们的二进制值时它将是 Test2|Test16|Test20。
  • 感谢您的确认,我不想计算:)
  • 我只是在Windows中使用了程序员计算器:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
相关资源
最近更新 更多