枚举中能否混合字符串与数字?C#黑杰克游戏枚举显示问题求助
关于C#枚举的两个问题解答
一、枚举中能否混合字符串与数字类型的成员?
先给你明确结论:在C#里,枚举的所有成员本质上都是整数类型(默认是int,也可以指定byte、long等其他整数类型),你看到的"字符串"只是枚举成员的名称标识符,并非实际存储的类型。
说白了,不存在"混合字符串与数字类型成员"的说法——所有枚举成员的底层值都是整数,成员名称只是用来指代这些整数值的标签,而且名称必须符合C#的标识符规则(比如不能直接用数字2当成员名,这也是你用Two而不是2的原因)。
二、如何将Face.Two显示为数字2?
针对你的黑杰克游戏场景,有几种实用的实现方式,按需选择即可:
方法1:DescriptionAttribute+扩展方法(推荐,可复用)
这是最常用的优雅方案,通过特性标记每个成员的显示文本,再用扩展方法统一读取:
首先给枚举成员添加特性(需要引用System.ComponentModel命名空间):
using System.ComponentModel; public enum Face { A, [Description("2")] Two, [Description("3")] Three, [Description("4")] Four, [Description("5")] Five, [Description("6")] Six, [Description("7")] Seven, [Description("8")] Eight, [Description("9")] Nine, [Description("10")] Ten, J, Q, K }
然后写一个扩展方法来提取特性值:
public static class FaceExtensions { public static string GetDisplayText(this Face face) { var fieldInfo = face.GetType().GetField(face.ToString()); var descriptionAttr = fieldInfo?.GetCustomAttributes(typeof(DescriptionAttribute), false) .FirstOrDefault() as DescriptionAttribute; return descriptionAttr != null ? descriptionAttr.Description : face.ToString(); } }
使用时直接调用:
Face cardFace = Face.Two; Console.WriteLine(cardFace.GetDisplayText()); // 输出 "2"
方法2:直接用switch语句(简单直观,适合小枚举)
如果你的枚举成员不多,直接用switch判断也很方便,不需要额外引用和反射:
public static string GetFaceDisplayText(Face face) { return face switch { Face.Two => "2", Face.Three => "3", Face.Four => "4", Face.Five => "5", Face.Six => "6", Face.Seven => "7", Face.Eight => "8", Face.Nine => "9", Face.Ten => "10", _ => face.ToString() // 其他成员直接返回名称 }; }
调用示例:
Console.WriteLine(GetFaceDisplayText(Face.Two)); // 输出 "2"
方法3:字典映射(灵活易维护)
提前创建枚举值到显示文本的字典,需要时直接查找:
private static readonly Dictionary<Face, string> _faceDisplayMap = new Dictionary<Face, string> { { Face.A, "A" }, { Face.Two, "2" }, { Face.Three, "3" }, // 依次添加其他成员... { Face.K, "K" } }; public static string GetFaceDisplayText(Face face) { return _faceDisplayMap.TryGetValue(face, out var text) ? text : face.ToString(); }
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

