2012-06-19 21 views
5

Estoy probando un fragmento de ejemplo que he encontrado como respuesta en another Questionoperador && no se puede aplicar

Sin embargo, el compilador es escupir a cabo esta "Operador & & no se puede aplicar a operandos de tipo largo y bool". ¿Por qué hace esto? Cuando leo el código, dice "Si la máscara y el permiso son mayores que 0, devuelva el éxito bool"

¿Estoy leyendo esto mal?

(Además, nadie lo llamaron como un mal ejemplo por lo que esperaba que funcione. No es que yo soy un codificador de copiar y pegar)

bool CheckMask(long Mask, long TestPermission) { 
    return Mask && TestPermission > 0; 
} 

long mask = 4611686844973976575; 

const long MASK_ViewListItems = 0x0000000000000001; 
bool HasPermission_ViewListItems = CheckMask(mask, MASK_ViewListItems); 
// HasPermission_ViewListItems is true 

const long MASK_UseClientIntegration = 0x0000001000000000; 
bool HasPermission_UseClientIntegration = CheckMask(mask, MASK_UseClientIntegration); 
// HasPermission_UseClientIntegration is false 

Hay una gran cantidad de preguntas similares sobre StackOverflow y he hecho clic en la mayoría de ellos, hay una gran lista a mi derecha mientras escribo. Ninguno se ha aplicado a mi situación, al menos pude ver la relación entre las respuestas y mi problema.

Respuesta

12

Está utilizando && (conditional AND, only valid for bool operands) en lugar de & (bitwise AND, valid for bool operands or integer operands) - Sospecho que quiere esto último, y también debería usar corchetes debido a las reglas de precedencia. Me gustaría cambiar los nombres de los parámetros a seguir las convenciones de nomenclatura de .NET, también - y hacer que estática, ya que no se basa en ningún estado:

static bool CheckMask(long mask, long testPermission) 
{ 
    return (mask & testPermission) > 0; 
} 

También podría adaptar a la utilización de una enumeración en lugar de long :

[Flags] 
public enum Permissions 
{ 
    ViewListItems = 1 << 0, 
    ... 
    UseClientIntegration = 1 << 9 
} 

static bool CheckMask(Permissions mask, Permissions testPermission) 
{ 
    return (mask & testPermission) != 0; 
} 
+0

Gracias, esto fue muy informativo, terminé aprendiendo bastante sobre el cambio de bit implementando estas ideas. – Amicable

3

supongo esto es lo que quiere:

(Mask & TestPermission) != 0 

Por lo tanto, es necesario:

  • un bit a bit & (en lugar de && que se aplica sólo a bool)
  • y supongo que desea comprobar si cualquier bit se establece incluyendo el bit de signo (por lo != en lugar de >).
Cuestiones relacionadas