このシナリオでは、簡潔は理解できるものとはまったく異なります。
(MyEnum)((((int)myEnum+1) % 3) + 1)
説明
まず、この式は列挙型をその整数表現にキャストしています。次に、1 を減算して列挙値を 0 にリベースし、モジュール演算子 ( %
) が機能するようにします。次に、あなたが言及した減算操作を実行しています(-1)。負のオペランドを避けるために、モジュラス演算を適用した後に効果がない 3 を追加します。これら 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);
}