我的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
相关产品推荐
相关产品推荐

