2009-12-11 18 views
8

Il ne semble pas être un moyen d'utiliser C# 'opérateur ternaire s sur deux octets comme ceci:Comment utiliser l'opérateur ternaire C# avec deux valeurs d'octets?

byte someByte = someBoolean ? 0 : 1; 

Ce code échoue actuellement à compiler avec « Impossible de convertir le type de source « int » pour cibler le type « octet » ", parce que le compilateur traite les nombres comme des entiers. Apparemment, il n'y a pas de suffixe désigné pour indiquer que 0 et 1 sont des octets, donc les seules solutions de contournement sont (a) de lancer le résultat dans un octet ou (b) d'utiliser un contrôle if-else après tout.

Des pensées?

+0

ça compile très bien pour moi ... quelle version du framework utilisez-vous? – kolosy

Répondre

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

La distribution n'est pas un problème ici, en fait, le code IL ne devrait pas avoir de cast du tout.

Edit: L'IL généré se présente comme suit:

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

Cela a été reconnu par le demandeur. Il cherche des alternatives – Randolpho

+12

@Randolpho: Non, l'OP a dit qu'il pouvait lancer le * résultat * - la réponse de Lucero jette les * opérandes * qui auront un effet différent; la distribution est effectivement effectuée au moment de la compilation plutôt que le temps d'exécution. –

+0

Ahh ... bon point. – Randolpho

3

compilant sur OK VS2008.

Correction: Cette compile OK dans VS2008:

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

Mais cette ne:

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

Odd!

Modifier: Suivant les conseils de Eric (voir son commentaire ci-dessous), j'ai essayé ceci:

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

Et il compile parfaitement. Pas que je me méfie d'Eric; Je voulais juste inclure ceci ici pour l'exhaustivité.

+2

ouais, même voyage ici ... peut-être c'est le fait que votre première déclaration est garantie de toujours atteindre 0? – kolosy

+4

Nous avons besoin de Skeet. : p – CesarGon

+0

@CesarGon: avez-vous essayé de cette façon [byte someByte = (somebool == true)? 0: 1; ] J'ai dû utiliser des crochets pour indiquer le bloc de code! – t0mm13b

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

vous pouvez toujours faire:

var myByte = Convert.ToByte(myBool); 

Cela donnera myByte == 0 pour faux et myByte == 1 pour vrai.

+2

Je suis vraiment surpris qu'il ait fallu si longtemps à quelqu'un pour le suggérer. – Powerlord

+0

Trop occupé à faire des commentaires stupides, je suppose. :) – Randolpho