在这种情况下,简洁与可以理解的完全不同:
(MyEnum)((((int)myEnum+1) % 3) + 1)
解释
首先,这个表达式将枚举转换为它的整数表示。然后,它减去 1 以将枚举值重新设置为 0,以便模块运算符 ( %
) 起作用。然后它正在执行您提到的减法运算(-1)。为了避免负操作数,它添加了 3,这在应用模数运算后将不起作用。将这三个操作组合起来与添加 1 相同。然后,它执行模块操作,实现您正在寻找的循环属性。然后它重新设置值以再次从 1 开始(通过添加 1),最后将结果数字转换回 MyEnum。
当枚举具有更多值时会发生什么?
此表达式假定您的枚举以 3 结尾。如果您想将它用于具有更多项目的枚举,那么您需要使用一些反射,您可能应该将其提取到一个方法中:
MyEnum PreviousMyEnum(MyEnum myEnum)
{
int maxValue = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Max();
return (MyEnum)((((int)myEnum -2 + maxValue) % maxValue) + 1);
}