如何将枚举泛型类型的变量转换为 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 并返回的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 五 泛型 枚举

无法将类型“Int”的值转换为泛型中的预期参数类型“Int”

c#中泛型集合怎样写强制类弄转换

将返回值转换为泛型类型

在泛型方法中返回特定类型,具体取决于运行时没有反射或动态的枚举值

将返回值转换为泛型类型