Ce înseamnă atributul Enum [Flags] în C#?

Din când în când văd o enumerare ca următoarea:

[Flags]
public enum Options 
{
    None    = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8
}

Nu înțeleg ce face exact atributul [Flags].

Are cineva o explicație sau un exemplu bun pe care l-ar putea posta?


person Brian Leahy    schedule 12.08.2008    source sursă
comment
De asemenea, este de remarcat, pe lângă răspunsul acceptat, că VB.NET de fapt necesită [Flags] - cel puțin conform băieților .NET: social.msdn.microsoft.com/forums/en-US/cshardplanguage /   -  person Rushyo    schedule 30.07.2012
comment
Notă, nu este necesar în VB în zilele noastre. Salvați comportamentul ca C# - doar schimbă ieșirea ToString(). Rețineți că puteți face, de asemenea, SAU logic, ÎN ENUM în sine. Foarte tare. Pisică = 1, Câine = 2, CatAndDog = Pisică || Câine.   -  person Chalky    schedule 04.08.2015
comment
@Chalky Vrei să spui CatAndDog = Cat | Dog (SAU logic în loc de Condițional), presupun?   -  person DdW    schedule 12.09.2016
comment
@DdW, parțial corect: | ar trebui folosit, dar | se numește OR binar. II este SAU logic (care permite scurtcircuitarea): Cel puțin conform Microsoft ;) msdn.microsoft.com/en-us/library/f355wky8.aspx   -  person Pieter21    schedule 01.04.2018


Răspunsuri (13)


Atributul [Flags] ar trebui utilizat ori de câte ori enumerabilul reprezintă o colecție de valori posibile, mai degrabă decât o singură valoare. Astfel de colecții sunt adesea folosite cu operatori pe biți, de exemplu:

var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;

Rețineți că atributul [Flags] nu permite acest lucru de la sine - tot ce face este să permită o reprezentare frumoasă prin metoda .ToString():

enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }
[Flags] enum SuitsFlags { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }

...

var str1 = (Suits.Spades | Suits.Diamonds).ToString();
           // "5"
var str2 = (SuitsFlags.Spades | SuitsFlags.Diamonds).ToString();
           // "Spades, Diamonds"

De asemenea, este important să rețineți că [Flags] nu face automat valorile enumerate cu puteri de două. Dacă omiteți valorile numerice, enumerarea nu va funcționa așa cum s-ar putea aștepta în operațiunile pe biți, deoarece valorile încep implicit cu 0 și cresc.

Declarație incorectă:

[Flags]
public enum MyColors
{
    Yellow,  // 0
    Green,   // 1
    Red,     // 2
    Blue     // 3
}

Valorile, dacă sunt declarate astfel, vor fi Galben = 0, Verde = 1, Roșu = 2, Albastru = 3. Acest lucru îl va face inutil ca steaguri.

Iată un exemplu de declarație corectă:

[Flags]
public enum MyColors
{
    Yellow = 1,
    Green = 2,
    Red = 4,
    Blue = 8
}

Pentru a prelua valorile distincte din proprietatea dvs., puteți proceda astfel:

if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
    // Yellow is allowed...
}

sau înainte de .NET 4:

if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
    // Yellow is allowed...
}

if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
    // Green is allowed...
}    

Sub huse

Acest lucru funcționează deoarece ați folosit puteri de doi în enumerarea dvs. Sub coperte, valorile dvs. de enumerare arată astfel în numere binare și zerouri:

 Yellow: 00000001
 Green:  00000010
 Red:    00000100
 Blue:   00001000

În mod similar, după ce ați setat proprietatea AllowedColors la Roșu, Verde și Albastru folosind operatorul binar SAU |, AllowedColors arată astfel:

myProperties.AllowedColors: 00001110

Deci, atunci când recuperați valoarea, efectuați de fapt pe biți și & pe valori:

myProperties.AllowedColors: 00001110
             MyColor.Green: 00000010
             -----------------------
                            00000010 // Hey, this is the same as MyColor.Green!

Valoarea Niciunul = 0

Și în ceea ce privește utilizarea lui 0 în enumerarea dvs., citând din MSDN:

[Flags]
public enum MyColors
{
    None = 0,
    ....
}

Utilizați None ca nume al constantei enumerate de flag a cărei valoare este zero. Nu puteți utiliza constanta enumerată None într-o operație AND pe biți pentru a testa un indicator, deoarece rezultatul este întotdeauna zero. Totuși, puteți efectua o comparație logică, nu pe biți, între valoarea numerică și Nicio constantă enumerată pentru a determina dacă sunt setați biți din valoarea numerică.

Puteți găsi mai multe informații despre atributul flags și despre utilizarea acestuia la msdn și proiectarea steaguri la msdn

person andynil    schedule 12.08.2008
comment
De asemenea, nu înțeleg ce face cu adevărat atributul Steaguri? Se pare că pot să definesc și să folosesc enum-ul meu de steaguri foarte bine fără atributul. Este folosit doar ca indicație că enumerarea poate fi folosită ca steaguri? - person Oskar; 06.08.2009
comment
Flags în sine nu face nimic. De asemenea, C# nu necesită steaguri per se. Dar implementarea ToString a enumerarii dvs. folosește steaguri, la fel și Enum.IsDefined, Enum.Parse etc. Încercați să eliminați steaguri și uitați-vă la rezultatul MyColor.Yellow | MyColor.Red; fără ea primești 5, cu Flags primești Galben, Roșu. Unele alte părți ale cadrului folosesc, de asemenea, [Flags] (de exemplu, Serializarea XML). - person Ruben; 17.08.2009
comment
Atributul Flags are un efect mai mare decât metoda ToString. Visual studio îl folosește cel puțin într-o anumită măsură atunci când folosește o Enum în designer. Vedeți întrebarea mea aici: stackoverflow.com/q/15663166/1111886 - person Fr33dan; 27.03.2013
comment
Prefer să folosesc constante de forma A = 1 ‹‹ 0, B = 1 ‹‹ 1, C = 1 ‹‹ 2 ... Mult mai ușor de citit, înțeles, verificat vizual și schimbat. - person Nick Westgate; 09.04.2013
comment
Metoda .HasFlag(Enum flag) ia parametrul de tip Enum, astfel încât tipul valorii ar trebui să fie în casetă, ceea ce este rău pentru performanță - person Aleksei Chepovoi; 04.05.2013
comment
@AlekseiChepovoi Enum derivă din clasa ValueType, aceasta înseamnă că este tratată ca struct la fel ca int, float etc. - person borrrden; 24.06.2013
comment
@borrrden, când trecem clasa Enum (clasa care definește metoda HasFlag), aceasta este transmisă prin referință, așa cum am primit-o. Am citit asta în CLR-ul lui Jeffrey Richter prin C# ediția a treia, capitolul Enums and Bit Flags. - person Aleksei Chepovoi; 27.06.2013
comment
@AlekseiChepovoi Am și cartea aceea, așa că o voi verifica. Totuși, pare să zboare în fața a tot ceea ce știu despre C#. Fiecare articol pe care îl pot găsi spune că enumerarile sunt obiecte de valoare care nu sunt alocate pe heap. - person borrrden; 27.06.2013
comment
@borrrden, la naiba da! Am găsit asta: msdn.microsoft.com/en-us/library/ system.enum.aspx - consultați partea Observații: Enum este clasa de bază pentru toate enumerările din .NET Framework. și Enumerarea nu moștenește în mod explicit de la Enum; relația de moștenire este gestionată implicit de compilator. Deci, când scrieți: public enum bla bla bla - acesta este un tip de valoare. Dar, metoda HasFlag vrea să-i oferiți o instanță System.Enum care este o clasă (tip de referință:) - person Aleksei Chepovoi; 28.06.2013
comment
Enum.IsDefined nu ia în considerare FlagsAttribute. Niciuna dintre următoarele nu returnează adevărat, chiar și cu atributul: Galben | Verde, Galben, Verde, 3 - person TheXenocide; 07.12.2013
comment
exemplul tău ar avea mai mult sens dintr-o percepție a steagului dacă albastru = 2 și verde = 3, deoarece până la urmă verde este combinația de galben și albastru - person MikeT; 11.06.2015
comment
Dacă doriți să excludeți un flag din enumerare, utilizați xor, care este ^ în C#. Deci, dacă aveți myProperties.AllowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;. Puteți face: myProperties.AllowedColors = myProperties.AllowedColors ^ MyColor.Blue //myProperties.AllowedColors == MyColor.Red | Mycolor.Green - person Josh Noe; 10.02.2018
comment
Mă uitam ce reprezintă 10... după câteva teste, aceasta corespunde valorii 2 și valorii 8 sau Green | Blue. de asemenea, valorile lui Yellow = 1, Green = 2,... 8 ajută la înțelegerea cu ușurință a ceea ce înseamnă 9 (8+1) sau 11 (8+2+1) față de reprezentarea deplasării (‹‹). - person Jaider; 26.05.2021

De asemenea, puteți face acest lucru

[Flags]
public enum MyEnum
{
    None   = 0,
    First  = 1 << 0,
    Second = 1 << 1,
    Third  = 1 << 2,
    Fourth = 1 << 3
}

Mi se pare că deplasarea biților este mai ușoară decât tastarea 4,8,16,32 și așa mai departe. Nu are niciun impact asupra codului dvs., deoarece totul este făcut în timpul compilării

person Orion Edwards    schedule 12.08.2008
comment
Singurul lucru care nu-mi place la aceste comenzi rapide este dacă se întâmplă să salvezi aceste enumerari în baza de date ca int. Apoi, trebuie să scoateți calculatorul de mai multe ori pentru a vă da seama ce valori corespund căror enumerare atunci când analizați datele. - person JeremyWeir; 14.05.2012
comment
@JeremyWeir Poți explica cum ar fi diferit de folosirea 1, 2 , 4, 8, 16, ...? De asemenea, calculatorul din Windows 7 are biți pe care puteți face clic. - person Silvermind; 27.05.2012
comment
La asta vreau să spun, prefer să am întregul int în codul sursă. Dacă am o coloană pe un tabel din baza de date numită MyEnum care stochează o valoare a uneia dintre enumerări și o înregistrare are 131.072, ar trebui să scot calculatorul pentru a-mi da seama că aceasta corespunde enumerarii cu valoarea 1 ‹‹17. Spre deosebire de a vedea doar valoarea 131.072 scrisă în sursă. - person JeremyWeir; 29.05.2012
comment
totul este făcut la compilare, acest tip de comentariu poate fi interesant pentru unii, dar mi se pare frustrant, deoarece implică faptul că, să zicem, deplasările de 20 de biți în timpul execuției vor avea un impact măsurabil asupra performanței. CPU-urile sunt foarte bune la deplasări de biți, enumerarile nu vor avea un număr arbitrar de membri și oricum acest lucru nu va funcționa pentru mai mult de 32 sau 64 de elemente. Nu este foarte important ca problemă de performanță. - person jwg; 14.02.2013
comment
@jwg Sunt de acord, este o prostie să fii prea îngrijorat de performanța de rulare a acestui lucru, dar, totuși, cred că este plăcut să știu că acest lucru nu va fi inserarea de biți oriunde folosești enumerarea. Mai degrabă o chestie „asta e îngrijită” decât orice legat de performanță - person Orion Edwards; 15.02.2013
comment
@JeremyWeir - Mai mulți biți vor fi setați într-o valoare de enumerare a steagului. Deci metoda dvs. de analiză a datelor este ceea ce este nepotrivit. Rulați o procedură pentru a reprezenta valoarea dvs. întreagă în binar. 131,072 [D] = 0000 0000 0000 0001 0000 0000 0000 0000 [B] [32].. Cu al 17-lea bit setat, o valoare de enumerare atribuită 1‹‹17 este ușor de determinat. 0110 0011 0011 0101 0101 0011 0101 1011 [b] [32] .. valorile enumerate atribuie 1‹‹31, 1‹‹30, 1‹‹26, 1‹‹26, 1‹‹26, 1‹‹26, 1‹‹26, 1‹‹.25. etc. ajutorul unui calculator deloc.. pe care mă îndoiesc că ați fi capabil să-l determinați deloc fără a obține rep. binară. - person Brett Caswell; 19.03.2013
comment
De asemenea, menționând că puteți deplasa biți de la valorile enumerate anterioare, mai degrabă decât direct de la numere, adică Third = Second << 1 în loc de Third = 1 << 2 -- consultați descrierea mai completă de mai jos - person drzaus; 16.05.2013
comment
Îmi place asta, dar odată ce ajungi la limitele superioare ale tipului de enumerare de bază, compilatorul nu avertizează împotriva deplasărilor de biți, cum ar fi 1 << 31 == -2147483648, 1 << 32 == 1, 1 << 33 == 2 și așa mai departe. În schimb, dacă spui ThirtySecond = 2147483648 pentru o enumerare de tip int, compilatorul aruncă o eroare. - person aaaantoine; 04.06.2014
comment
Doar pentru a adăuga o altă opțiune care este nouă cu C# 7, puteți folosi 0b1, 0b10 etc. (sau 0b00000001 dacă vă place totul aliniat corect!) - person Graham Wager; 15.03.2017

Combinarea răspunsurilor https://stackoverflow.com/a/8462/1037948 (declarație prin deplasare de biți) și https://stackoverflow.com/a/9117/1037948 (folosind combinații în declarație) puteți deplasa biți valorile anterioare în loc să utilizați numere. Nu îl recomand neapărat, ci doar indicând că poți.

Mai degrabă decât:

[Flags]
public enum Options : byte
{
    None    = 0,
    One     = 1 << 0,   // 1
    Two     = 1 << 1,   // 2
    Three   = 1 << 2,   // 4
    Four    = 1 << 3,   // 8

    // combinations
    OneAndTwo = One | Two,
    OneTwoAndThree = One | Two | Three,
}

Poti declara

[Flags]
public enum Options : byte
{
    None    = 0,
    One     = 1 << 0,       // 1
    // now that value 1 is available, start shifting from there
    Two     = One << 1,     // 2
    Three   = Two << 1,     // 4
    Four    = Three << 1,   // 8

    // same combinations
    OneAndTwo = One | Two,
    OneTwoAndThree = One | Two | Three,
}

Confirmare cu LinqPad:

foreach(var e in Enum.GetValues(typeof(Options))) {
    string.Format("{0} = {1}", e.ToString(), (byte)e).Dump();
}

Rezultate în:

None = 0
One = 1
Two = 2
OneAndTwo = 3
Three = 4
OneTwoAndThree = 7
Four = 8
person drzaus    schedule 16.05.2013
comment
Combinațiile sunt o recomandare bună, dar cred că deplasarea biților înlănțuită ar fi predispusă la erori de copiere și inserare, cum ar fi Doi = Unu ‹‹ 1, Trei = Unu ‹‹ 1 etc... Numerele întregi incrementale ale forma 1 ‹‹ n sunt mai sigure și intenția este mai clară. - person Rupert Rawnsley; 20.03.2014
comment
@RupertRawnsley pentru a-mi cita răspunsul: › Nu îl recomand neapărat, ci doar subliniind că poți - person drzaus; 20.03.2014

Consultați următoarele pentru un exemplu care arată declarația și utilizarea potențială:

namespace Flags
{
    class Program
    {
        [Flags]
        public enum MyFlags : short
        {
            Foo = 0x1,
            Bar = 0x2,
            Baz = 0x4
        }

        static void Main(string[] args)
        {
            MyFlags fooBar = MyFlags.Foo | MyFlags.Bar;

            if ((fooBar & MyFlags.Foo) == MyFlags.Foo)
            {
                Console.WriteLine("Item has Foo flag set");
            }
        }
    }
}
person OJ.    schedule 12.08.2008
comment
Acest exemplu funcționează chiar dacă omiteți [Flags]. Este partea [Flags] despre care încerc să învăț. - person gbarry; 07.08.2019

În extensie la răspunsul acceptat, în C#7 steagurile de enumerare pot fi scrise folosind literale binare:

[Flags]
public enum MyColors
{
    None   = 0b0000,
    Yellow = 0b0001,
    Green  = 0b0010,
    Red    = 0b0100,
    Blue   = 0b1000
}

Cred că această reprezentare arată clar cum funcționează steagurile sub copertă.

person Thorkil Holm-Jacobsen    schedule 20.07.2017
comment
Și în C# 7.2 este și mai clar cu separator principal! 0b_0100 - person Vincenzo Petronio; 26.10.2019

Am am întrebat recent despre ceva asemanator.

Dacă utilizați steaguri, puteți adăuga o metodă de extensie la enums pentru a ușura verificarea steaguri conținute (vezi postarea pentru detalii)

Acest lucru vă permite să faceți:

[Flags]
public enum PossibleOptions : byte
{
    None = 0,
    OptionOne = 1,
    OptionTwo = 2,
    OptionThree = 4,
    OptionFour = 8,

    //combinations can be in the enum too
    OptionOneAndTwo = OptionOne | OptionTwo,
    OptionOneTwoAndThree = OptionOne | OptionTwo | OptionThree,
    ...
}

Atunci poți face:

PossibleOptions opt = PossibleOptions.OptionOneTwoAndThree 

if( opt.IsSet( PossibleOptions.OptionOne ) ) {
    //optionOne is one of those set
}

Mi se pare mai ușor de citit decât cele mai multe moduri de a verifica steagurile incluse.

person Keith    schedule 12.08.2008
comment
IsSet este o metodă de extensie presupun? - person Robert MacLean; 02.06.2009
comment
Da, citește cealaltă întrebare la care fac link pentru detalii: stackoverflow.com/questions/7244 - person Keith; 02.06.2009
comment
.NET 4 adaugă o metodă HasFlag la enumerari, astfel încât să puteți face opt.HasFlag( PossibleOptions.OptionOne ) fără a fi nevoie să scrieți propriile extensii - person Orion Edwards; 20.07.2010
comment
Rețineți că HasFlag este mult mai lent decât efectuarea operațiunilor pe biți. - person Wai Ha Lee; 12.09.2018
comment
@WaiHaLee Puteți utiliza metoda de extensie CodeJam.EnumHelper.IsFlagSet care este compilată într-o versiune rapidă folosind Expression: github.com/rsdn/CodeJam/wiki/M_CodeJam_EnumHelper_IsFlagSet__1 - person NN_; 29.04.2019

Când lucrez cu steaguri, declar adesea articole suplimentare Nici unul și Toate. Acestea sunt utile pentru a verifica dacă toate steagurile sunt setate sau nu este setat niciun steag.

[Flags] 
enum SuitsFlags { 

    None =     0,

    Spades =   1 << 0, 
    Clubs =    1 << 1, 
    Diamonds = 1 << 2, 
    Hearts =   1 << 3,

    All =      ~(~0 << 4)

}

Utilizare:

Spades | Clubs | Diamonds | Hearts == All  // true
Spades & Clubs == None  // true


Actualizare 2019-10:

Începând cu C# 7.0, puteți utiliza literale binare, care sunt probabil mai intuitiv de citit:

[Flags] 
enum SuitsFlags { 

    None =     0b0000,

    Spades =   0b0001, 
    Clubs =    0b0010, 
    Diamonds = 0b0100, 
    Hearts =   0b1000,

    All =      0b1111

}
person Jpsy    schedule 23.10.2018
comment
Da, combinând toate răspunsurile din această pagină, îl folosesc în mod regulat acum, dar cu separatorul principal 0b_1111 - person Marcelo Scofano Diniz; 03.08.2020

@Nidonocu

Pentru a adăuga un alt indicator la un set existent de valori, utilizați operatorul de atribuire OR.

Mode = Mode.Read;
//Add Mode.Write
Mode |= Mode.Write;
Assert.True(((Mode & Mode.Write) == Mode.Write)
  && ((Mode & Mode.Read) == Mode.Read)));
person steve_c    schedule 12.08.2008

Pentru a adăuga Mode.Write:

Mode = Mode | Mode.Write;
person David Wengier    schedule 12.08.2008

Pentru mine este ceva prea prolix în legătură cu constructul if ((x & y) == y)..., mai ales dacă x ȘI y sunt ambele seturi compuse de steaguri și vrei să știi doar dacă există o suprapunere.

În acest caz, tot ce trebuie să știți este dacă există o valoare diferită de zero[1] după ce ați mascat biți.

[1] Vezi comentariul lui Jaime. Dacă am fi bitmasking în mod autentic, ar trebui doar să verificăm dacă rezultatul este pozitiv. Dar din moment ce enums pot fi negative, chiar și, în mod ciudat, atunci când sunt combinate cu atributul [Flags] , este defensiv să codificați pentru != 0 în loc de > 0.

Pornind de la configurația lui @andnil...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BitFlagPlay
{
    class Program
    {
        [Flags]
        public enum MyColor
        {
            Yellow = 0x01,
            Green = 0x02,
            Red = 0x04,
            Blue = 0x08
        }

        static void Main(string[] args)
        {
            var myColor = MyColor.Yellow | MyColor.Blue;
            var acceptableColors = MyColor.Yellow | MyColor.Red;

            Console.WriteLine((myColor & MyColor.Blue) != 0);     // True
            Console.WriteLine((myColor & MyColor.Red) != 0);      // False                
            Console.WriteLine((myColor & acceptableColors) != 0); // True
            // ... though only Yellow is shared.

            Console.WriteLine((myColor & MyColor.Green) != 0);    // Wait a minute... ;^D

            Console.Read();
        }
    }
}
person ruffin    schedule 01.05.2013
comment
Enum se poate baza pe un tip semnat, deci ar trebui să utilizați != 0 în loc de ›0. - person raven; 16.08.2013
comment
@JaimePardos -- Atâta timp cât îi păstrăm octeți sinceri, așa cum fac eu în acest exemplu, nu există conceptul de negativ. Doar de la 0 la 255. După cum MSDN avertizează, fiți precaut dacă definiți un număr negativ ca o constantă enumerată, deoarece... [care] ar putea face codul dvs. confuz și ar putea încuraja erorile de codare. Este ciudat să gândești în termeni de bitflag-uri negative! ;^) Voi edita mai multe peste un pic. Dar ai dreptate, dacă folosim valori negative în enum, ar trebui să verificăm != 0. - person ruffin; 16.08.2013

Steagurile vă permit să utilizați mascarea de biți în cadrul enumerației dvs. Acest lucru vă permite să combinați valorile de enumerare, păstrând în același timp care sunt specificate.

[Flags]
public enum DashboardItemPresentationProperties : long
{
    None = 0,
    HideCollapse = 1,
    HideDelete = 2,
    HideEdit = 4,
    HideOpenInNewWindow = 8,
    HideResetSource = 16,
    HideMenu = 32
}
person Jay Mooney    schedule 12.08.2008
comment
Acest lucru este incorect, puteți utiliza bitmasking chiar dacă enumerarea nu este marcată ca Flags. - person Shadow; 01.11.2020

Scuze dacă cineva a observat deja acest scenariu. Un exemplu perfect de steaguri pe care îl putem vedea în reflecție. Da Binding Flags ENUM .

[System.Flags]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public enum BindingFlags

Utilizare

// BindingFlags.InvokeMethod
// Call a static method.
Type t = typeof (TestClass);

Console.WriteLine();
Console.WriteLine("Invoking a static method.");
Console.WriteLine("-------------------------");
t.InvokeMember ("SayHello", BindingFlags.InvokeMethod | BindingFlags.Public | 
    BindingFlags.Static, null, null, new object [] {});
person kbvishnu    schedule 27.01.2020

  • Indicatoarele sunt utilizate atunci când o valoare enumerabilă reprezintă o colecție de membri enumerați.

  • aici folosim operatori pe biți, | și &

  • Exemplu

                 [Flags]
                 public enum Sides { Left=0, Right=1, Top=2, Bottom=3 }
    
                 Sides leftRight = Sides.Left | Sides.Right;
                 Console.WriteLine (leftRight);//Left, Right
    
                 string stringValue = leftRight.ToString();
                 Console.WriteLine (stringValue);//Left, Right
    
                 Sides s = Sides.Left;
                 s |= Sides.Right;
                 Console.WriteLine (s);//Left, Right
    
                 s ^= Sides.Right; // Toggles Sides.Right
                 Console.WriteLine (s); //Left
    
person Mukesh Pareek    schedule 11.11.2020
comment
Exemplul dvs. este greșit (și nu produce rezultatul pe care îl pretinde), deoarece utilizarea corectă a Flags necesită ca valorile dvs. de enumerare să aibă biți unici setați. Și ar trebui să existe cel puțin un set (cu excepția cazului în care aveți o pseudo valoare precum None). Enumarea dvs. ar trebui să fie ` public enum Sides { Stânga=1, Dreapta=2, Sus=4, Jos=8 } ` - person Jakob; 18.11.2020