2009-06-18 23 views
6

Trong C# (3.5) tôi thử như sau:Tại sao tôi không thể thực hiện logic boolean trên byte?

byte byte1 = 0x00; 
byte byte2 = 0x00; 
byte byte3 = byte1 & byte2; 

và tôi nhận được Lỗi 132:. "Không thể ngầm chuyển đổi loại 'int' thành 'byte' Một chuyển đổi rõ ràng tồn tại (là bạn thiếu một dàn diễn viên?) ". Điều tương tự cũng xảy ra với | và ^.

Tôi đang làm gì sai? Tại sao nó hỏi tôi về ints? Tại sao tôi không thể làm logic boolean trên byte?

+2

Tất cả số học trong .NET dựa trên int. Có một câu hỏi liên quan với một số cuộc thảo luận khá. Nó không phải là một câu trả lời cho câu hỏi của bạn, nhưng bạn có thể nhận được một số cái nhìn sâu sắc trong cách C# giao dịch với số học nói chung: http://stackoverflow.com/questions/941584/byte-byte-int-why –

+0

"Bởi vì C# không phải là hoàn hảo ngôn ngữ ", là cách tôi sẽ giải thích điều này. Đây là một trong những mụn cóc của nó (và so với các ngôn ngữ khác, C# có ít nhất là mụn cóc ít nhất và ít gây hại nhất ...) –

Trả lời

12

Các toán tử khác nhau không được khai báo cho byte - cả hai toán hạng được thăng cấp thành int và kết quả là int. Ví dụ, bổ sung:

byte byte1 = 0x00; 
byte byte2 = 0x00; 
byte byte3 = byte1 + byte2; // Compilation error 

Lưu ý rằng tập hợp chất làm việc:

byte1 += byte2; 

Có một recent SO question on this. Tôi đồng ý điều này đặc biệt khó chịu cho các hoạt động bitwise, mặc dù kết quả phải luôn luôn có cùng kích thước, và đó là một hoạt động hợp lý hoàn toàn hợp lệ.

Là một khắc phục, bạn chỉ có thể cast kết quả trở lại byte:

byte byte3 = (byte) (byte1 & byte2); 
+0

Nó có thể là khó chịu khi C# đánh giá byte + byte dưới dạng "int", yêu cầu typecast nếu một muốn gán kết quả trở lại một byte, nhưng vb.net thì tệ hơn. Hai biến hoặc các hằng số được xác định thuộc loại 'Byte' sẽ được thêm vào dưới dạng 'Byte' (chết nếu kết quả lớn hơn 255 ngay cả khi nó được gán cho 'Integer') nhưng các chữ số được sử dụng cho bất kỳ thứ gì khác hơn một nhiệm vụ trực tiếp được coi là số nguyên. Nó đẹp, mặc dù vb.net xử lý các lệnh Booleans ops chủ yếu là hợp lý (kích thước của 'x Và y' nên, nhưng không phải là, của toán hạng * nhỏ hơn * chưa ký, nếu có). – supercat

0

Bởi vì byte (và ngắn) loại không thực hiện những nhà khai thác

Xem Spec: 4.1.5

Các vấn đề liên quan