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