如何将枚举泛型类型的变量转换为 int 并返回
Posted
技术标签:
【中文标题】如何将枚举泛型类型的变量转换为 int 并返回【英文标题】:How to cast a variable of an enum generic type to int and back 【发布时间】:2021-07-04 05:24:46 【问题描述】:我正在使用 C# 编写一个接受枚举类型参数的类,如下所示:
class EnumWrapper<T>
where T: Enum
在类内部,我有一个方法接受 T 类型的参数,我需要将其转换为 int,如下所示:
void DoSomething(T arg)
int a = (int)arg;
但编译器会发出 CS0030 错误“无法将类型 'T' 转换为 'int'。当我尝试将 int 转换回 T 时会发生类似的情况。但是,这适用于未提供的固定枚举类型通过类型参数。例如,这可以正常工作:
void DoSomething(DayOfWeek arg)
int a = (int)arg;
为什么会发生这种情况,如何在通用枚举类型和 int 之间进行转换?
【问题讨论】:
请记住,枚举可以有任何整数基类型——如果你愿意,你可以有enum Foo : ulong
。在这种情况下,您希望您的代码做什么?
@canton7:是的,我知道这一点。 :-)
这就是“为什么会发生这种情况”部分。对于“我如何投射...”部分,请回答我的问题:在这种情况下,您希望您的代码做什么?
@CesarGon 请查看我回答的结尾:) 几年前我也遇到了一个非常相似的问题
字符串描述应该使用[Description]
属性(它已经支持 resx/translations 等)。层次结构,也可能来自自定义属性,我猜是[Hierarchy("parent")]
?
【参考方案1】:
您可以将IConvertible
添加到通用约束并使用ToInt32
方法,例如
class EnumWrapper<T>
where T : Enum, IConvertible
void DoSomething(T arg)
int a = arg.ToInt32(null);
详情请查看the Enum
constraint。此外,正如 cmets 中所述,您的 enum
不一定基于 int
类型
【讨论】:
或者,跳过约束并调用Convert.ToInt32(arg)
(内部测试IConvertible
)。
缺少标题的“后部”部分。但这已经在这里解释了:***.com/a/10387134/284240以上是关于如何将枚举泛型类型的变量转换为 int 并返回的主要内容,如果未能解决你的问题,请参考以下文章
无法将类型“Int”的值转换为泛型中的预期参数类型“Int”