2009-06-18 7 views
6

En C# (3.5) Je les opérations suivantes:Pourquoi ne puis-je pas faire de logique booléenne sur les octets?

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

et j'obtiens l'erreur 132:. « Impossible de convertir implicitement le type 'int' à 'octet' existe une conversion explicite (vous manque un casting?) ". La même chose arrive avec | et ^.

Qu'est-ce que je fais mal? Pourquoi me pose-t-il des questions? Pourquoi ne puis-je pas faire de logique booléenne sur les octets?

+2

Toute l'arithmétique dans .NET est basée sur int. Il y a une question connexe avec beaucoup de discussion. Ce n'est pas une réponse à votre question, mais vous pourriez avoir un aperçu de la façon dont C# traite l'arithmétique en général: http://stackoverflow.com/questions/941584/byte-byte-int-why –

+0

"Parce que C# n'est pas parfait la langue ", c'est ainsi que je l'expliquerais. C'est un de ses verrues (et comparé à d'autres langages, C# a de loin les moins et les moins percutants ...) –

Répondre

12

Plusieurs opérateurs ne sont pas déclarés pour byte - les deux opérandes sont promus à int et le résultat est int. Par exemple, l'addition:

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

Notez que les affectations de composés fonctionnent:

byte1 += byte2; 

Il y avait un recent SO question on this. Je suis d'accord que c'est particulièrement ennuyeux pour les opérations au niveau du bit, où le résultat devrait toujours être la même taille, et c'est une opération entièrement valide en termes logiques.

Pour contourner ce problème, vous pouvez simplement jeter le résultat à octet:

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

Il peut être ennuyeux que C# évalue octet + octet comme type "int", nécessitant un typecast si un veut attribuer le résultat à un octet, mais vb.net est pire. Deux variables ou constantes définies de type 'Byte' seront ajoutées en tant que type 'Byte' (en train de mourir si le résultat est supérieur à 255 même s'il va être affecté à un 'Integer') mais littéraux numériques utilisés pour autre chose que une affectation directe est considérée comme un nombre entier. C'est sympa, bien que vb.net gère les ops booléens de façon sensée (la taille de 'x And y' devrait être, mais n'est pas, celle de * l'opérande * plus petit * non signé, le cas échéant). – supercat

0

Comme octet (et court) types ne mettent pas en œuvre les opérateurs

Voir Spec: 4.1.5