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

我的C#新switch表达式无法编译,问题出在哪里?

解决C# Switch表达式编译错误

错误原因

你写的是switch表达式,它属于产生值的表达式范畴,而非可独立执行的语句。C#不允许将普通表达式单独作为语句使用(仅赋值、方法调用、递增/递减、新对象实例化这类特殊表达式可作为语句),因此单独写switch表达式并加分号会触发编译错误。

另外需要注意:如果你的ProcessBookedMessage、ProcessBookingRequest等方法是void返回类型,switch表达式本身就不适用——因为表达式必须返回一个值,而void方法没有返回值,这时候应该改用传统switch语句。

解决方案

方案1:改用传统Switch语句(适用于void返回方法)

如果你的处理方法都是无返回值的,直接用传统switch语句即可:

switch (email.EmailTypeId)
{
    case (int)Enums.EmailType.Booked:
        ProcessBookedMessage(email, document);
        break;
    case (int)Enums.EmailType.BookingRequest:
        ProcessBookingRequest(email, document);
        break;
    case (int)Enums.EmailType.Message:
        ProcessMessage(email, document);
        break;
    case (int)Enums.EmailType.Remainder:
    case (int)Enums.EmailType.ReminderSoon:
        ProcessReminder(email, document);
        break;
    // 建议添加默认分支处理未预期的类型
    default:
        throw new ArgumentOutOfRangeException(nameof(email.EmailTypeId), "无效的邮件类型ID");
}

方案2:使用Switch表达式并处理返回值(适用于有返回值的方法)

如果处理方法有相同类型的返回值,需要将switch表达式的结果赋值给变量、作为返回值或直接使用:

// 赋值给变量
var processResult = email.EmailTypeId switch
{
    (int)Enums.EmailType.Booked => ProcessBookedMessage(email, document),
    (int)Enums.EmailType.BookingRequest => ProcessBookingRequest(email, document),
    (int)Enums.EmailType.Message => ProcessMessage(email, document),
    (int)Enums.EmailType.Remainder or (int)Enums.EmailType.ReminderSoon => ProcessReminder(email, document),
    // 必须覆盖所有可能情况,C# 8+要求switch表达式是穷尽的
    _ => throw new ArgumentOutOfRangeException(nameof(email.EmailTypeId), email.EmailTypeId, "无效的邮件类型")
};

// 或直接作为方法返回值
return email.EmailTypeId switch
{
    (int)Enums.EmailType.Booked => ProcessBookedMessage(email, document),
    (int)Enums.EmailType.BookingRequest => ProcessBookingRequest(email, document),
    (int)Enums.EmailType.Message => ProcessMessage(email, document),
    (int)Enums.EmailType.Remainder or (int)Enums.EmailType.ReminderSoon => ProcessReminder(email, document),
    _ => throw new ArgumentOutOfRangeException(nameof(email.EmailTypeId), email.EmailTypeId, "无效的邮件类型")
};

内容的提问来源于stack exchange,提问作者Greg Gum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:45:20