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

枚举状态切换异常:Next/Prev方法无法更新枚举值

枚举扩展方法调用后值未更新问题

定义的枚举类型

public enum State
{
    None = 0,
    A = 1,
    B = 2,
    Complete = 3
}

扩展方法实现

public static State Next(this State state) => (State)Math.Clamp((int)state++, (int)State.None, (int)State.Complete);
public static State Prev(this State state) => (State)Math.Clamp((int)state--, (int)State.None, (int)State.Complete);

调用代码

print(_state);
_state = _state.Next();
print(_state);   

调用后两次打印结果均为A,枚举值未按预期更新。


问题根源

  1. 值类型按值传递:枚举属于值类型,扩展方法的state参数是原变量的副本,对副本执行++/--操作不会影响原变量本身。
  2. 后置自增/自减的特性:state++是先返回当前值,再对副本做自增操作,因此(int)state++实际取的是参数的初始值,自增后的副本值根本没被用到。

修复方案

直接基于当前枚举值的数值进行加减计算,而非操作副本的自增/自减:

public static State Next(this State state) => (State)Math.Clamp((int)state + 1, (int)State.None, (int)State.Complete);
public static State Prev(this State state) => (State)Math.Clamp((int)state - 1, (int)State.None, (int)State.Complete);

修改后调用Next()时,会正确计算当前值+1后的结果,再通过Math.Clamp限制在None到Complete的合法范围内,返回的更新值赋值给_state即可完成预期的状态切换。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:01:15