You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

枚举中能否混合字符串与数字?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:05:48