如何从C#枚举中获取int值:从新手到专家

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么没有int的枚举就像没有咖啡因的咖啡?

\n\n

想象一下这个场景:你正在用C#编写很棒的代码,使用枚举(enum)来存储订单状态、星期几或访问级别。一切看起来既美观又易读。但突然出现一个任务:将这个值保存到数据库、通过HTTP API发送或只是输出到日志。这时你遇到了难题——需要将枚举转换为int。

\n\n

这不仅仅是教科书上的“愿望”。根据Stack Overflow的统计数据,“Get int value from enum in C#”这个问题获得了数十万次浏览。即使是经验丰富的开发人员有时也会感到困惑:类型转换?Convert.ToInt32?如果底层整数类型不是int怎么办?

\n\n

在本文中,我们将介绍所有合法的方法来从C#枚举中获取整数值。从简单的类型转换开始,一直到使用Unsafe.As的高级技巧(没错,确实存在!)。您将了解哪种方法更快、哪种更安全、以及哪种最好避免在生产环境中使用。

\n\n

1. C#中枚举的结构:快速入门

\n\n

在进行转换之前,让我们先回顾一下基础知识。在C#中,enum是一种值类型,继承自System.Enum,其默认底层类型是int。但您可以显式指定其他类型:

\n\n
public enum Status : byte\n{\n    New = 0,\n    Active = 1,\n    Closed = 2\n}\n\npublic enum Priority : long\n{\n    Low = 10,\n    Medium = 50,\n    High = 100\n}
\n\n

这很重要!如果您的枚举使用byte或long,那么简单地转换为int可能会导致错误或数据丢失。

\n\n

2. 方法1:显式转换(类型转换)——经典之作

\n\n

最直接、最快的方法是使用类型转换运算符。当您确切知道底层类型是int时,此方法有效。

\n\n
enum Day { Monday = 1, Tuesday = 2, Wednesday = 3 }\n\nDay today = Day.Tuesday;\nint dayValue = (int)today; // 结果:2\n\nConsole.WriteLine(dayValue); // 输出:2
\n\n

优点:

\n
    \n
  • 性能最佳——编译器生成一条IL指令。
  • \n
  • 简单且可读性强。
  • \n
\n

缺点:

\n
    \n
  • 如果底层类型不是int,编译器会报错或发出警告。
  • \n
  • 不适用于通过long或byte定义的枚举(需要双重类型转换)。
  • \n
\n\n

何时使用:在90%的情况下,当您的枚举是标准类型(: int)时。

\n\n

3. 方法2:Convert.ToInt32——万能工具

\n\n

Convert.ToInt32()方法就像一把瑞士军刀,用于转换。它接受一个object,并尝试通过IConvertible接口将其转换为int。

\n\n
enum Status { New = 0, Active = 1, Closed = 2 }\n\nStatus current = Status.Active;\nint statusCode = Convert.ToInt32(current); // 结果:1\n\nConsole.WriteLine(statusCode); // 1
\n\n

优点:

\n
    \n
  • 适用于任何底层类型(byte、short、long等)。
  • \n
  • 无需显式知道枚举的类型。
  • \n
\n

缺点:

\n
    \n
  • 比直接类型转换慢(涉及虚方法调用)。
  • \n
  • 如果传入的不是枚举,可能会抛出InvalidCastException。
  • \n
\n\n

何时使用:当您编写通用代码或处理编译时底层类型未知的枚举时。

\n\n

4. 方法3:GetHashCode()——危险的技巧(请不要这样做!)

\n\n

在互联网上,您可能会看到一条“天才”建议:使用GetHashCode()。是的,从技术上讲,它

博客

书籍推荐