枚举状态切换异常: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,枚举值未按预期更新。
问题根源
- 值类型按值传递:枚举属于值类型,扩展方法的
state参数是原变量的副本,对副本执行++/--操作不会影响原变量本身。 - 后置自增/自减的特性:
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
相关产品推荐
相关产品推荐

