铸造枚举到uint

时间:2009-12-06 11:45:25

标签: c# enums

我正在编写一个带Enum并将其强制转换为uint的函数。从我在投射到int时所看到的,你必须先将它投射到一个物体上:(int) (object) myEnumValue。如果您编写(int) myEnumValue,则会出现编译时异常。

现在,当我试图将它投射到uint时,我期待(uint) (object) myEnumValue会好起来的。它编译得很好,但在运行时会生成InvalidCastException。为了让它发挥作用,我已经使用了

(uint) (int) (object) myEnumValue

我觉得它看起来很有趣,所以我很开心,但为什么会这样呢?

问问为什么不可能将object转换为uint可能更为正确,但我对是否有另一种方式来{{1}感兴趣到Enum。有吗?

修改

上下文是一个函数,如下所示:

uint

编辑2:

最好的解决方案就是thecoop提到的:

public static uint ToUInt (Enum e)
{
    return (uint) (int) (object) e;
}

3 个答案:

答案 0 :(得分:13)

(uint) (object) myEnum方法失败,因为默认情况下,C#枚举使用int作为其基础类型,int是他们在装箱时变成的内容。 C#语法使它看起来像枚举从其基础类型继承(如enum MyEnum : uint)。

您必须首先明确告诉编译器从objectint取消装箱,然后执行从intuint的数字转换。 (即使语法相同,从object拆分到值类型与在intuint之间转换的过程也不同。)

答案 1 :(得分:5)

  

从我在转换到int时所看到的,你必须先将它强制转换为一个对象:(int) (object) myEnum。如果您编写(int) myEnum,则会出现编译时异常。

不正确。您可以直接将枚举值转换为整数类型。

  

现在,当我试图将它投射到uint时,我期待(uint)(对象)myEnum会没问题。它编译得很好,但运行时会生成InvalidCastException。为了让它工作,我用过:          (uint) (int) (object) myEnum
  我觉得它看起来很有趣,所以我很开心,但为什么会这样呢?

当您将枚举值转换为object时,它将被设置为基础类型,默认情况下为int。您不能直接将装箱值取消装入除实际类型以外的任何类型。即使这样也会失败:

short s = 10;
object o = s;
int i = (int)o; // throws `InvalidCastException` while `int i = (int)s;` works.

答案 2 :(得分:0)

如果您需要向相反的方向发展,即从基础类型到特定类型的枚举:

enum MyEnumType { a, b, c };
//...
MyEnumType enum_val = (MyEnumType)Enum.ToObject(typeof(MyEnumType), 2);
Console.WriteLine(enum_val == MyEnumType.c);
// "True"

我在创作泛型类型时发现这是必要的(而不是简单的转换)。由于您不能使用'where'子句来充分约束泛型< T>对于您的枚举类型,编译器不允许您向其转换数字。