2009-12-11 117 views
8

Có vẻ như không phải là một cách để sử dụng C# 'hành ternary s trên hai byte như vậy:Làm thế nào để sử dụng toán tử ternary của C# với hai giá trị byte?

byte someByte = someBoolean ? 0 : 1; 

Đó là mã hiện thất bại trong việc biên soạn với "Không thể chuyển đổi loại nguồn 'int' nhắm mục tiêu loại 'byte' ", bởi vì trình biên dịch xử lý các số như số nguyên. Rõ ràng không có hậu tố được chỉ định để chỉ ra rằng 0 và 1 là byte, do đó cách giải quyết duy nhất là (a) đưa kết quả vào một byte hoặc (b) để sử dụng một điều khiển if-else sau khi tất cả.

Mọi suy nghĩ?

+0

nó biên dịch tốt cho tôi ... bạn đang sử dụng phiên bản khung nào? – kolosy

Trả lời

19
byte someByte = someBoolean ? (byte)0 : (byte)1; 

Dàn diễn viên không phải là vấn đề ở đây, trên thực tế, mã IL không nên có dàn diễn viên nào cả.

Edit: Các IL tạo ra vẻ như thế này:

L_0010: ldloc.0   // load the boolean variable to be checked on the stack 
L_0011: brtrue.s L_0016 // branch if true to offset 16 
L_0013: ldc.i4.1   // when false: load a constant 1 
L_0014: br.s L_0017  // goto offset 17 
L_0016: ldc.i4.0   // when true: load a constant 0 
L_0017: stloc.1   // store the result in the byte variable 
+0

Điều này đã được xác nhận bởi người hỏi. Anh ấy đang tìm kiếm các giải pháp thay thế – Randolpho

+12

@Randolpho: Không, OP cho biết anh ấy có thể truyền * kết quả * - Câu trả lời của Lucero sẽ diễn ra * toán hạng * sẽ có hiệu ứng khác; các diễn viên được thực hiện một cách hiệu quả tại thời gian biên dịch chứ không phải là thời gian thực hiện. –

+0

Ahh .... điểm tốt. – Randolpho

3

Đó biên dịch OK trên VS2008.

Correction: Đây biên dịch OK trong VS2008:

byte someByte = true ? 0 : 1; 
byte someByte = false ? 0 : 1; 

Nhưng này không:

bool someBool = true; 
byte someByte = someBool ? 0 : 1; 

Odd!

Sửa: Sau lời khuyên của Eric (xem bình luận của ông dưới đây), tôi đã cố gắng này:

const bool someBool = true; 
byte someByte = someBool ? 0 : 1; 

Và nó biên dịch một cách hoàn hảo. Không phải là tôi không tin tưởng Eric; Tôi chỉ muốn bao gồm điều này ở đây vì lợi ích của sự hoàn chỉnh.

+2

vâng, cùng một chuyến đi ở đây ... có thể đó là thực tế là tuyên bố đầu tiên của bạn được đảm bảo luôn đạt 0? – kolosy

+4

Chúng ta cần Skeet. : p – CesarGon

+0

@CesarGon: bạn đã thử nó theo cách này chưa [byte someByte = (somebool == true)? 0: 1; ] Tôi đã phải sử dụng dấu ngoặc vuông để chỉ khối mã! – t0mm13b

4
byte someByte = (byte)(someBoolean ? 0 : 1); 
6

Bạn có thể luôn luôn làm:

var myByte = Convert.ToByte(myBool); 

này sẽ mang lại myByte == 0 cho sai và myByte == 1 cho đúng.

+2

Tôi thực sự ngạc nhiên rằng phải mất một thời gian dài để một người nào đó đề xuất nó. – Powerlord

+0

Quá bận rộn đưa ra nhận xét ngớ ngẩn, tôi đoán vậy. :) – Randolpho

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