2015-12-01 2 views
0

Я столкнулся с чем-то, что кажется мне странным, но в то же время имеет смысл по причинам, которые я не знаю.C# enum, double previous enum value

У меня есть это перечисление:

[Flags] public enum Flags { RemoveQuoteMarks = 1, t1 = 2, t2 = 4, t3 = 8, t4 = 16, t5 = 32, t6 = 64, t7 = 128 } 

Раньше я не вручную установить значение перечислений, они индекс от 0 и Стандартно увеличение на 1 правых?

Ну, я заметил странное поведение, когда я пытался загрузить эту строку:

string value = "t1, t3, t4, t7"; 

и разобрать его с помощью:

Flags flags = (Flags)Enum.Parse(typeof(Flags), value); 

и результат был просто «Т7», так что я сделал некоторые исследования , и заметил, что многие другие использовали ручную индексацию, где каждое значение перемножения было удвоено по сравнению с предыдущим (например, «t3 = 8», «t4 = 16»), поэтому я применил это правило к моему, и это сработало. теперь отображается как:

t1, t3, t4, t7 

по желанию, зачем мне вручную настраивать мои значения перечисления?

+0

потому что он использует побитовый оператор '|'. если вы не модифицируете такие значения, это будет выглядеть как '1 | 3 | 4 | 7 ', что приведет к' 7'. потому что 7 является '111' в двоичном коде и будет есть все остальные значения;) –

+0

Прочтите ответ на дубликат, особенно раздел« под крышкой ». – Blorgbeard

+0

Спасибо всем, я чувствую, что теперь я понимаю намного лучше! –

ответ

1

Причина в том, что перечисление флагов представлено как двоичное число. Каждое значение, которое является степенью 2 (1,2,4,8,16 и т.д.) соответствует различному индексу в двоичном числе:

  • 2 -> 10
  • 4 -> 100
  • 8 -> 1000

Это необходимо для определения того, какие флаги содержат фактическое значение. Например, если ваш класс имеет значение перечисления 1110, он имеет значения флагов 2,4 и 8.

Если вы используете значения, которые не являются степенями 2, C# больше не может разумно различать, какие значения перечисления представлены флаги ваших классов при выполнении поразрядных и &.