C# | Почему проверка enum со switch ведёт себя странно?

Я использую приложение СолоЛеарн для программирования, и там есть кодинг как пвп. И задался один вопрос, в котором нужно определить какой будет вывод кода. Там в коде создаётся enum Elements. В методе Main создаётся переменная, со значением 0. После инициализации этой переменной проверяется с оператором switch значение Elements.Mg. С помощью кейсов проверяется значение. Если значение является Elements.K или Elements.Ca, то переменной, которую мы инициализировать присваивается значение 1-2. А некоторые кейсы пустые. Итог кода - он выводит число 2 (из нашей переменной). Почему и как и что за фигня? Код

P.s.: извиняюсь что скриншотом. На телефоне при переписывания кода мог сделать ошибку.


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

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

Я кажется понял как работает свитч оператор. На языке руби можно записать так:

X = 6

case X
when 1, 2, 3, 4:
    puts "1-4"
when 5, 6, 7:
    puts "5-7"

На шарпе же можно написать вот-так:

int X = 6;

switch (X)
{
    case 1:
    case 2:
    case 3:
    case 4:
        WriteLine("1-4");
        break;
    case 5:
    case 6:
    case 7:
        WriteLine ("5-7");
        break;
}

Если я что-то не учел, напишите в комментариях.

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

Раз уж не очень поняли, то я попытаюсь обьяснить поподробнее. Обьекты enum которым не присваиваются значение по дефолту будет присваиваться целочисленное число начиная с нуля. То есть:

    enum Elements
    {
        Na, // На самом деле равен 0
        K, // На самом деле равен 1
        Mg = 12, 
        Ca // На самом деле равен 13, т.к. после 12 - 13
    }

Получается что не важно присвоили ли мы значению телу enum, он будет автоматически выставляться. Вы делаете условие switch(Elemenets.Mg) который на самом деле равен 2, то есть выполнится то условие которое равно 2. В switch есть возможность делать вложенные кейсы, то есть если условие попадает в кейс в котором есть другой кейс, то этот кейс тоже выполниться. К примеру

switch (2)
        {
            case 2:
            case 1:
                Console.WriteLine("Кейс 1");
                break;
        }

На консоль выведится Кейс 1, т.к. условие попадает в кейс, в котором находится кейс, тут особо задумываться не нужно. И у вас тоже условие попадает в case Elements.Mg в котором находится кейс Elements.Ca, который присваивает значие переменной group равной 2, именно поэтому на консоль выводится 2. Надеюсь всё подробоно обьяснил, если остануться вопросы, спрашивайте.

→ Ссылка