2012-06-19 30 views
5

मैं एक उदाहरण का परीक्षण कर रहा हूँ झलकी है कि मैं another Questionऑपरेटर && लागू नहीं किया जा सकता है

पर एक जवाब के रूप में पाया हालांकि संकलक "प्रकार लंबी और bool की ऑपरेंड के लिए लागू नहीं किया जा सकता ऑपरेटर & &" इस बाहर थूकना है। ऐसा क्यों करता है? जैसा कि मैंने कोड पढ़ा है, यह कहता है "अगर मुखौटा और अनुमति 0 से अधिक वापसी की सफलता बूल"

क्या मैं यह गलत पढ़ रहा हूं?

(इसके अलावा, कोई भी इसे बाहर एक बुरा उदाहरण के रूप में कहा जाता है। इसलिए मैं यह काम करने की उम्मीद नहीं है कि मैं एक कॉपी-पेस्ट सांकेतिक शब्दों में बदलनेवाला हूँ)

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 

StackOverflow पर समान सवालों का एक बहुत भयंकर हैं और मैंने उनमें से अधिकांश के माध्यम से क्लिक किया है, मेरे टाइप के रूप में मेरे दाईं ओर एक बड़ी सूची है। किसी ने मेरी स्थिति पर लागू नहीं किया है, कम से कम मैं जवाब और मेरी समस्या के बीच संबंध देखने में सक्षम था।

उत्तर

12

आप & (bitwise AND, valid for bool operands or integer operands) के बजाय && (conditional AND, only valid for bool operands) का उपयोग कर रहे हैं - मुझे संदेह है कि आप बाद वाले को चाहते हैं, और आपको प्राथमिकता नियमों के कारण ब्रैकेट का भी उपयोग करना चाहिए। मैं पैरामीटर नाम नेट नामकरण सम्मेलनों का पालन करने, भी बदल देंगे - और यह स्थिर यह किसी भी राज्य पर निर्भर नहीं करता के रूप में करते हैं:

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

तुम भी बजाय long एक enum का उपयोग करने को बदलने के लिए चाहते हो सकता है :

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

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

धन्यवाद, यह बहुत ही जानकारीपूर्ण था - इन विचारों को लागू करने के बारे में थोड़ा सा स्थानांतरण सीखने के लिए समाप्त हुआ। – Amicable

3

मैं इस अनुमान लगा रहा हूँ कि आप क्या चाहते है:

(Mask & TestPermission) != 0 

तो, आप की जरूरत है:

  • एक बिटवाइज़ & (बजाय && केवल bool पर लागू होने वाला)
  • और मैं तुम्हें किसी भी बिट संकेत बिट (ताकि > की != बजाय) सहित सेट है, तो जाँच करना चाहते हैं अनुमान लगा रहा हूँ।
संबंधित मुद्दे

 संबंधित मुद्दे