Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Switch-Case с перечислением С#

#c_sharp #enum


Такая проблема. Есть перечисление

[Flags]
public enum SortType
{
    Amount = 0,
    Consumptions = 1,
    Date = 2,
    Description = 3,
    Group = 4,
    Incomes = 5,
    Kind = 6, 
    Counterparty = 7,
    Type = 8,
    Valute = 9
}


По не му нужно пройтись switch-caseом, учитывая компоновку, потому что нужно выбрать
множество вариантов для сортировки, но при некоторых раскладах, вроде следующего, появляется
ошибка:

case SortType.Consumptions:
    break;
case SortType.Consumptions | SortType.Date:
    break;
//Предложение Switch содержит несколько случаев со значением "3" (Откуда, если в
данном контексте оно впервые?)
case SortType.Consumptions | SortType.Description:
    break;
case SortType.Consumptions | SortType.Group:
    break;
//Предложение Switch содержит несколько случаев со значением "5" (То же самое)
case SortType.Consumptions | SortType.Incomes:


И так повторяется на каждое нечётное число. Хотя в похожем коде (вместо Consumprions
стоит Amount) ошибок нет. Что делать? 
    


Ответы

Ответ 1



Чтобы корректно работали побитовые операции, каждый флаг должен занимать свой отдельный бит: [Flags] public enum SortType { Amount = 0, Consumptions = 1 << 0, Date = 1 << 1, Description = 1 << 2, Group = 1 << 3, Incomes = 1 << 4, Kind = 1 << 5, Counterparty = 1 << 6, Type = 1 << 7, Valute = 1 << 8 } Иначе получается что, например, Description - это уже побитовое пересечение Consumptions и Date.

Ответ 2



При работе с флагами, желательно, чтобы значения соответствовали отдельным битам, например: 1 (0b0000001) 2 (0b0000010) 4 (0b0000100) 8 (0b0001000) и т.д. Это позволит при использовании битового ИЛИ получать одно значение, соответствующее сразу двум флагам, при этом это значение будет уникальным для любой комбинации флагов и по нему всегда можно будет сказать, с помощью каких флагов оно образовано. В вопросе, значения перечисления идут по порядку, в связи с этим возникают коллизии, когда одно значение можно получить несколькими способами, например: Incomes = 5 Consumptions | Group = 5 Date | Description = 5 Именно на это и ругается switch. В связи с этим может возникнуть вопрос, а что же делает атрибут Flags, собственно, ничего не делает

Комментариев нет:

Отправить комментарий