我正在编写一个带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;
}
答案 0 :(得分:13)
(uint) (object) myEnum
方法失败,因为默认情况下,C#枚举使用int
作为其基础类型,int
是他们在装箱时变成的内容。 C#语法使它看起来像枚举从其基础类型继承(如enum MyEnum : uint
)。
您必须首先明确告诉编译器从object
到int
取消装箱,然后执行从int
到uint
的数字转换。 (即使语法相同,从object
拆分到值类型与在int
和uint
之间转换的过程也不同。)
答案 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>对于您的枚举类型,编译器不允许您向其转换数字。