Можно ли в C# у Enum переходить к следующему значению покругу?

Я решил написать шахматы. У меня есть поле move обозначающее чей сейчас ход.

public class Chess
{
    ColorPiece move;
    ...
}

public enum ColorPiece
{
    White,
    Black
}

Я думал что можно просто инкрементом move++(ибо компилятор не жалуется) чтоб "переключать" но оказалось так он выходит за границы. Есть ли возможность это исправить?

P.S. знаю что можно по другому но интересно просто.


Ответы (3 шт):

Автор решения: Qwertiy

Идея такая:

move ^= 1;

Но на C# это не скомпилируется - придётся добавить значение в сам енум:

public enum ColorPiece
{
    White = 0,
    Black = 1,
    Xor = 1,
}

move ^= ColorPiece.Xor;

Добавляю отдельным значением, чтобы не было привязки к тому, кто там 0, а кто - 1.

→ Ссылка
Автор решения: Uucyc

Аккумулирую. Правильный ответ в случае если enum из двух элементов:

enum Enum
{
   Start,
   End
}
var e = Enum.Start;
e ^= Enum.End;

В случае если больше то нашёл только e = e == Enum.END ? Enum.START : e++;

→ Ссылка
Автор решения: aepot

Для частного случая типа

enum Power 
{
    On = 0,
    Off = 1
}

Можно сделать просто

static Power Switch(Power value)
{
    return value ^ Power.Off;
}

Проверяем

Power power = Power.On;

for (int i = 0; i < 10; i++)
{
    Console.WriteLine(power);
    power = Switch(power);
}

Вывод в консоль

On
Off
On
Off
On
Off
On
Off
On
Off

Для более общего случая, когда неизвестно количество элементов перечисления, их значения или даже тип перечисления, можно написать такой метод

static T Next<T>(T value) where T : struct, Enum
{
    T[] values = Enum.GetValues<T>();
    int index = (Array.IndexOf(values, value) + 1) % values.Length;
    return values[index];
}

Проверяем

enum DayOfWeek
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}
DayOfWeek dayOfWeek = DayOfWeek.Monday;

for (int i = 0; i < 10; i++)
{
    Console.WriteLine(dayOfWeek);
    dayOfWeek = Next(dayOfWeek);
}

Вывод в консоль

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Monday
Tuesday
Wednesday
→ Ссылка