tag que enum clase c# enums enum-flags

c# - clase - que es un enum en java



HasFlags siempre devuelve true para el valor Ninguno(0) en enumeraciĆ³n (6)

Bueno Enum.HasFlags resuelve como algo como lo siguiente:

var hasNone = (myAnimals & Animals.None) == Animals.None

Esto siempre será cierto para un campo de enumeración de valor cero.

Esta es la definición de enumeración:

[Flags] enum Animals { None = 0, Dog = 1, Cat = 2, Horse = 4, Zebra = 8, }

Ahora, dado el siguiente código, ¿por qué el método HasFlag devuelve verdadero para el valor Animals.None?

Animals myAnimals = Animals.Dog | Animals.Horse; var hasNone = myAnimals.HasFlag(Animals.None); //true! Why? var hasCat = myAnimals.HasFlag(Animals.Cat); //false var hasDog = myAnimals.HasFlag(Animals.Dog); //true var hasHorse = myAnimals.HasFlag(Animals.Horse); //true var hasZebra = myAnimals.HasFlag(Animals.Zebra); //false


Desde MSDN

El método HasFlag devuelve el resultado de la siguiente expresión booleana.

thisInstance And flag = flag


Este es solo el comportamiento definido del método HasFlag . De la documentación de MSDN

si el valor subyacente de la bandera es cero, el método devuelve verdadero


Me he enfrentado a esto antes que a mí mismo. Es por diseño en el .NET Framework:

Si el valor subyacente de la bandera es cero, el método devuelve verdadero. Si este comportamiento no es deseable, puede usar el método Equals para probar la igualdad con cero y llamar a HasFlag solo si el valor subyacente de flag no es cero, como lo ilustra el siguiente ejemplo.

Puede leer un poco más sobre esto en el artículo de MSDN aquí: http://msdn.microsoft.com/en-GB/library/system.enum.hasflag.aspx


Ya hay una gran cantidad de respuestas que describen POR QUÉ sucede esto, así que solo agregaré que lo que puede hacer para obtener lo que está buscando es no usar HasFlag en ese caso, sino que var hasNone = myAnimals == Animals.None

Personalmente detesto los métodos de extensión, pero sería posible poner esto en una extensión en Enum si realmente valoras poder simplemente escribir myOptionEnum.HasNoFlags() . Sin embargo, solo correría con la comprobación explícita del valor None en este caso especial.


HasFlag es efectivamente esto:

HasFlag = (GivenFlag & Value) == GivenFlag; //"Anything" AND 0 == 0 --> always true