2009-06-18 3 views
6

In C# (3.5) Ich versuche folgendes:Warum kann ich keine boolesche Logik für Bytes verwenden?

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

und ich bekomme Fehler 132:. „Kann Typ 'int' auf 'byte' Eine explizite Konvertierung vorhanden ist (möglicherweise fehlt eine Guss?) Konvertieren nicht implizit ". Das Gleiche passiert mit | und ^.

Was mache ich falsch? Warum fragt es mich nach Ints? Warum kann ich keine boolesche Logik für Bytes verwenden?

+2

Alle Berechnungen in .NET basieren auf int. Es gibt eine verwandte Frage mit ziemlich viel Diskussion. Es ist keine Antwort auf Ihre Frage, aber Sie könnten einen Einblick bekommen, wie sich C# im Allgemeinen mit Arithmetik befasst: http://stackoverflow.com/questions/941584/byte-byte-int-why –

+0

"Weil C# nicht perfekt ist Sprache ", würde ich das erklären. Dies ist einer seiner Warzen (und im Vergleich zu anderen Sprachen hat C# bei weitem die wenigsten und die wenigsten wirkungsvollen Warzen ...) –

Antwort

12

Verschiedene Operatoren sind nicht für byte deklariert - beide Operanden werden auf int hochgestuft und das Ergebnis ist int. Zum Beispiel Zusatz:

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

Hinweis, dass die Verbindung Zuordnungen Arbeit tun:

byte1 += byte2; 

Es gab eine recent SO question on this. Ich stimme zu, dass dies für bitweise Operationen, bei denen das Ergebnis immer die gleiche Größe haben sollte, besonders lästig ist und es sich um eine logisch vollständig gültige Operation handelt.

Als Abhilfe können Sie das Ergebnis in Byte werfen gerade zurück:

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

Es kann lästig sein, dass C# byte + byte als Typ "int" auswertet und eine Typumwandlung erfordert möchte das Ergebnis zurück zu einem Byte zuweisen, aber vb.net ist schlechter. Zwei Variablen oder definierte Konstanten vom Typ 'Byte' werden als Typ 'Byte' hinzugefügt (wenn das Ergebnis größer als 255 ist, auch wenn es einer 'Ganzzahl' zugewiesen wird), aber numerische Literale, die für irgendetwas anderes als verwendet werden Eine direkte Zuweisung wird als Ganzzahl betrachtet. Es ist nett, dass vb.net Booleans Ops meist vernünftig handhabt (die Größe von 'x And y' sollte sein, aber nicht die des * kleineren * unsignierten Operanden, falls vorhanden). – supercat

0

Da Byte (und kurz) Typen implementieren nicht mit denen Betreiber

See Spec: 4.1.5