2009-06-18 7 views
6

W języku C# (3.5) I spróbuj wykonać następujące czynności:Dlaczego nie mogę wykonywać logiki boolowskiej na bajtach?

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

i dostaję błąd 132:. „Nie można niejawnie przekonwertować typu 'int' do 'bajt' Wyraźne konwersji istnieje (czy brakuje obsady?) ". To samo dzieje się z | i ^.

Co robię źle? Dlaczego pyta mnie o ints? Dlaczego nie mogę logiki boolowskiej na bajtach?

+2

Wszystkie arytmetyczne w .NET są oparte na int. Z niektórymi dyskusjami wiąże się podobne pytanie. To nie jest odpowiedź na twoje pytanie, ale możesz uzyskać wgląd w to, jak C# radzi sobie z arytmetyką w ogóle: http://stackoverflow.com/questions/941584/byte-byte-int-why –

+0

"Ponieważ C# nie jest idealne język ", tak to wytłumaczyłbym. Jest to jeden z jego brodawek (i w porównaniu z innymi językami, C# ma zdecydowanie najmniejszą i najmniej imponującą liczbę brodawek ...) –

Odpowiedz

12

Różne operatory nie są zadeklarowane dla byte - oba operandy zostaną awansowane na int, a wynikiem jest int. Na przykład, dodanie:

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

Należy zauważyć, że zadania złożone zrobić pracę:

byte1 += byte2; 

Było recent SO question on this. Zgadzam się, jest to szczególnie uciążliwe dla operacji bitowych, gdzie wynik powinien zawsze być tej samej wielkości i jest to logicznie całkowicie poprawna operacja.

Jako obejście, można po prostu rzucić wynik z powrotem do bajta:

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

Może być irytujące, że C# ocenia bajt + bajt jako typ "int", wymagając typecast, jeśli jeden chce przypisać wynik z powrotem do bajtu, ale vb.net jest gorszy. Dwie zmienne lub zdefiniowane stałe typu "Bajt" zostaną dodane jako typ "Bajt" (umierający, jeśli wynik jest większy niż 255, nawet jeśli ma być przypisany do "liczby całkowitej"), ale literały numeryczne, które są używane do czegokolwiek innego niż bezpośrednie przypisanie są traktowane jako liczby całkowite. Fajnie, chociaż ten vb.net obsługuje głównie opery Booleans w sensie (rozmiar 'xI y' powinien być, ale nie jest, * mniejszy * niepodpisany operand, jeśli jakiś). – supercat

0

Ponieważ bajt (i krótkie) typy nie wdrażają tych operatorów

widoczny Spec: 4.1.5

Powiązane problemy