2009-06-18 8 views
6

In C# (3,5) provo il seguente:Perché non posso eseguire la logica booleana sui byte?

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

e ottengo l'errore 132:. "Impossibile convertire implicitamente il tipo 'int' a 'byte' Esiste una conversione esplicita (Vi manca un cast?) ". Lo stesso succede con | e ^.

Cosa sto sbagliando? Perché mi sta chiedendo di ints? Perché non posso eseguire la logica booleana sui byte?

+2

Tutta l'aritmetica in .NET è basata su int. C'è una domanda correlata con un po 'di discussione. Non è una risposta alla tua domanda, ma potresti avere un'idea di come C# si occupa dell'aritmetica in generale: http://stackoverflow.com/questions/941584/byte-byte-int-why –

+0

"Perché C# non è perfetto lingua ", è come lo spiegherei. Questa è una delle sue verruche (e rispetto ad altre lingue, C# è di gran lunga la meno invasiva e meno invasiva ...) –

risposta

12

Vari operatori non sono dichiarati per byte - entrambi gli operandi vengono promossi a int e il risultato è int. Ad esempio, oltre:

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

Si noti che le assegnazioni di composti funzionano:

byte1 += byte2; 

C'era un recent SO question on this. Sono d'accordo che questo è particolarmente fastidioso per le operazioni bit a bit, tuttavia, in cui il risultato dovrebbe essere sempre della stessa dimensione, ed è un'operazione logicamente interamente valida.

Come soluzione alternativa, si può semplicemente lanciare il risultato di nuovo al byte:

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

Può essere fastidioso che C# valuti byte + byte come tipo "int", richiedendo un typecast se uno vuole assegnare il risultato a un byte, ma vb.net è peggio. Due variabili o costanti definite di tipo "Byte" saranno aggiunte come tipo "Byte" (morendo se il risultato è maggiore di 255 anche se verrà assegnato a un "Integer") ma letterali numerici che vengono utilizzati per qualcosa di diverso da un incarico diretto è considerato come un numero intero. È bello, anche se vb.net gestisce le operazioni booleane in modo sensato (la dimensione di 'x And y 'dovrebbe essere, ma non lo è, quella dell'operando * più piccolo * non firmato, se presente). – supercat

0

Poiché i tipi di byte (e breve) non implementano gli operatori

See Spec: 4.1.5

Problemi correlati