Почему выводит не все флаги

186
21 февраля 2019, 17:40

Есть готовые enum-ы

[Flags]
public enum UserFlags {
    guest = 0, // GUEST USER             //
        normal = 1, // NORMAL USER (DEFAULT)  //
        banned = 2, // USER IS BLOCKED        //
        online = 4 // USER IS ONLINE         //
}

Вот так устанавливаю флаги:

user.Flags = UserData.UserFlags.normal;
user.SetFlag(UserData.UserFlags.guest);
user.SetFlag(UserData.UserFlags.online);
public UserFlags Flags {
    get;
    internal set;
}
public void SetFlag(UserFlags flag, bool state = true) {
    Flags = state ? Flags |= flag : Flags &= ~flag;
}

Но если я пробую вывести Flags как тест в консоль от возвращает только Online и Normal а вот guest не учитывается.Почему?

Answer 1

Проблема в том, что флагом guest вы пытаетесь оперировать с несуществующим 0-вым битом. Решение достаточно простое - начинать с 1-го бита:

[Flags]
public enum UserFlags {
    guest = 1, // GUEST USER             //
    normal = 2, // NORMAL USER (DEFAULT)  //
    banned = 4, // USER IS BLOCKED        //
    online = 8 // USER IS ONLINE         //
}

другой вариант - использовать битовый сдвиг, чтобы не путаться в значениях когда флагов достаточно много и они становятся достаточно крупными числами:

[Flags]
public enum UserFlags {
    guest = 1 << 0, // GUEST USER             //
    normal = 1 << 1, // NORMAL USER (DEFAULT)  //
    banned = 1 << 2, // USER IS BLOCKED        //
    online = 1 << 3 // USER IS ONLINE         //
}
Answer 2

ToString() не обрабатывает enum со значением 0 и не выводит в консоль

READ ALSO
C# WPF Prism занять один регион другим

C# WPF Prism занять один регион другим

Как в C# WPF Prism занять один регион другим? Пример на Word'e:

179
Как дождаться закрытия формы?

Как дождаться закрытия формы?

Пишу автономное приложение, я вызываю форму

167
Объявление матриц в MathNet.Numeric

Объявление матриц в MathNet.Numeric

Нужно объявить две матрицы: 1х3 и 3х2 с конкретными значениями, а затем перемножить эти две матрицы

139
Когда ручной вызов GC.Collect() оправдан?

Когда ручной вызов GC.Collect() оправдан?

Часто нахожу в коде вызовы GCCollect(), например при работе с графиков через GDI+

158