Hãy để tôi làm rõ việc kinh doanh unchecked
. Các MSDN page tiểu bang rằng unchecked
được sử dụng để ngăn chặn kiểm tra tràn, mà nếu không, khi bên trong một ngữ cảnh được kiểm tra, cung cấp cho một lỗi biên dịch hoặc ném một ngoại lệ.
... NẾU bên trong ngữ cảnh được chọn.
Bối cảnh được kiểm tra hoặc rõ ràng:
checked { ... }
hoặc ngầm *, khi giao dịch với thời gian biên dịch hằng:
byte b = (byte)-6; //compile error
byte b2 = (byte)(200 + 200); //compile error
int i = int.MaxValue + 10; //compiler error
Nhưng khi giao dịch với runtime biến, bối cảnh là unchecked
theo mặc định **:
sbyte sb = -6;
byte b = (byte)sb; //no problem, sb is a variable
int i = int.MaxValue;
int j = i + 10; //no problem, i is a variable
Để tóm tắt và trả lời các câu hỏi ban đầu:
Cần byte<->sbyte
chuyển đổi trên hằng? Sử dụng unchecked
và dàn diễn viên:
byte b = unchecked((byte) -6);
Cần byte<->sbyte
chuyển đổi trên biến? Chỉ cần đúc:
sbyte sb = -6;
byte b = (byte) sb;
* Có một cách thứ ba để có được một bối cảnh kiểm tra theo mặc định: bằng cách tinh chỉnh các thiết lập trình biên dịch. Ví dụ. Visual Studio -> properties Project -> Build -> Advanced ... -> [X] Kiểm tra số học tràn/underflow
** Bối cảnh thời gian chạy được bỏ chọn theo mặc định trong C#. Trong VB.NET chẳng hạn, ngữ cảnh thời gian chạy mặc định được kiểm tra.
Nguồn
2013-03-15 13:33:39
Tại sao không chỉ truyền nó sang 'byte'? – V4Vendetta
@ V4Vendetta: Nó có hoạt động không, tôi đã đọc ở đâu đó nếu giá trị nằm ngoài phạm vi, điều đó âm tính với sbyte, sẽ ném ngoại lệ. –
Cũng không thực sự nói -1 của nó sau đó bạn sẽ nhận được nó như 255 – V4Vendetta