2012-06-19 30 views
5

Tôi đang thử nghiệm một ví dụ đoạn mã mà tôi tìm thấy như là một câu trả lời trên another Questionhành && không thể áp dụng

Tuy nhiên trình biên dịch được phun ra này "hành & & không thể được áp dụng cho toán hạng của lâu loại và bool". Tại sao lại thực hiện điều này? Khi tôi đọc mã, nó nói "Nếu mặt nạ và quyền lớn hơn 0 trở lại thành công bool"

Tôi có đọc sai không?

(Ngoài ra, không ai gọi nó ra như một tấm gương xấu vì vậy tôi mong đợi nó để làm việc. Không phải là tôi là một copy-paste coder)

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 

Có một awful nhiều câu hỏi tương tự trên StackOverflow và tôi đã nhấp qua hầu hết trong số họ, có một danh sách lớn ở bên phải của tôi khi tôi nhập. Không có gì áp dụng cho tình huống của tôi, ít nhất tôi đã có thể thấy mối quan hệ giữa các câu trả lời và vấn đề của tôi.

Trả lời

12

Bạn đang sử dụng && (conditional AND, only valid for bool operands) thay vì & (bitwise AND, valid for bool operands or integer operands) - Tôi nghi ngờ bạn muốn thứ hai và bạn cũng nên sử dụng dấu ngoặc đơn do các quy tắc ưu tiên. Tôi muốn thay đổi tên tham số để theo ước NET đặt tên, quá - và làm cho nó tĩnh vì nó không dựa vào bất cứ tiểu bang:

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

Bạn cũng có thể muốn thay đổi để sử dụng một enum thay vì long :

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

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

Cảm ơn, điều này rất thông tin - đã kết thúc việc học một chút công bằng về việc chuyển bit thực hiện những ý tưởng này. – Amicable

3

tôi đoán đây là những gì bạn muốn:

(Mask & TestPermission) != 0 

Vì vậy, bạn cần:

  • một Bitwise & (thay vì && mà chỉ áp dụng cho bool)
  • và tôi đoán bạn muốn kiểm tra nếu có bit được thiết lập bao gồm cả bit dấu (vì vậy != thay vì >).
Các vấn đề liên quan