OVH Cloud OVH Cloud

short et int

3 réponses
Avatar
Cirfain
Bonjour =E0 tous,

J'ai un petit pb de cast avec l'op=E9rateur ternaire ?:

Voici le d=E9but du code :
Je suis dans un boucle while(dr.read())

int bi20;
int bs20;

bi20 =3D (dr.IsDBNull(2) ? 0 : dr.GetInt16(2));
bs20 =3D (dr.IsDBNull(3) ? 0 : dr.GetInt16(3));

Si j'=E9cris =E7a j'ai une erreur :
Le type d'expression conditionnelle ne peut pas =EAtre=20
d=E9termin=E9, car 'int' et 'short' ex=E9cutent implicitement=20
une conversion crois=E9e

Je ne comprends pas cette erreur bi20 ou bs20 sont des=20
int, dans ma base j'ai des integers et =E7a :

if (dr.IsDBNull(2))
{ bi20 =3D 0;}=20
else
{bi20 =3D dr.GetInt16(2);}

=E7a marche.

Pourquoi l'op=E9rateur ternaire me casse les pieds avec une=20
conversion crois=E9e ? Il n'y a pourtant pas d'ambiguit=E9...
Sinon que faut il =E9crire ?

Merci.

3 réponses

Avatar
Frédéric Queudret [MS]
Bonsoir,

Essayez:
bi20 = (dr.IsDBNull(2) ? (short)0 : dr.GetInt16(2));
bs20 = (dr.IsDBNull(3) ? (short)0 : dr.GetInt16(3));

cdlt,
Frédéric.

"Cirfain" wrote in message
news:338d01c521a3$96c02d90$
Bonjour à tous,

J'ai un petit pb de cast avec l'opérateur ternaire ?:

Voici le début du code :
Je suis dans un boucle while(dr.read())

int bi20;
int bs20;

bi20 = (dr.IsDBNull(2) ? 0 : dr.GetInt16(2));
bs20 = (dr.IsDBNull(3) ? 0 : dr.GetInt16(3));

Si j'écris ça j'ai une erreur :
Le type d'expression conditionnelle ne peut pas être
déterminé, car 'int' et 'short' exécutent implicitement
une conversion croisée

Je ne comprends pas cette erreur bi20 ou bs20 sont des
int, dans ma base j'ai des integers et ça :

if (dr.IsDBNull(2))
{ bi20 = 0;}
else
{bi20 = dr.GetInt16(2);}

ça marche.

Pourquoi l'opérateur ternaire me casse les pieds avec une
conversion croisée ? Il n'y a pourtant pas d'ambiguité...
Sinon que faut il écrire ?

Merci.
Avatar
Bruno Jouhier [MVP]
Comme le message l'indique, il y a deux conversions implicites croisées
possibles pour ramener les 2 opérandes à un type commun:
* convertir 0 implicitement en short
* convertir dr.GetInt16(2) implicitement en int.
Dans le premier cas, l'expression ternaire est de type short
Dans le second cas, elle est de type int

Lorsqu'il y a ce genre d'ambiguité, le compilateur demande de désambiguer
explicitement. Tu peux donc t'en sortir avec:
test ? (short)0 : dr.GetInt16(2)
ou
test ? 0 : (int)dr.GetInt16(2)

Tu auras un pb un peu similaire avec l'opérateur ternaire sur des
sous-classes ayant un ancêtre commun. Si Sub1 et Sub2 sont deux sous classes
de C, l'expression suivante ne compile pas:

Sub1 sub1 = ...;
Sub2 sub2 = ...;
C result = test ? sub1 : sub2;

Mais ça passera avec:

C result = test ? (C)sub1 : sub2;

Bruno.

"Cirfain" a écrit dans le message de
news: 338d01c521a3$96c02d90$
Bonjour à tous,

J'ai un petit pb de cast avec l'opérateur ternaire ?:

Voici le début du code :
Je suis dans un boucle while(dr.read())

int bi20;
int bs20;

bi20 = (dr.IsDBNull(2) ? 0 : dr.GetInt16(2));
bs20 = (dr.IsDBNull(3) ? 0 : dr.GetInt16(3));

Si j'écris ça j'ai une erreur :
Le type d'expression conditionnelle ne peut pas être
déterminé, car 'int' et 'short' exécutent implicitement
une conversion croisée

Je ne comprends pas cette erreur bi20 ou bs20 sont des
int, dans ma base j'ai des integers et ça :

if (dr.IsDBNull(2))
{ bi20 = 0;}
else
{bi20 = dr.GetInt16(2);}

ça marche.

Pourquoi l'opérateur ternaire me casse les pieds avec une
conversion croisée ? Il n'y a pourtant pas d'ambiguité...
Sinon que faut il écrire ?

Merci.
Avatar
Cirfain
Ok, si j'ai bien compris le compilateur avait 2
possibilités de conversion suivant le cas et il ne lui en
faut qu'une seule...

Comme ma variable qui doit contenir le résultat est un
int, je pensais qu'il aurait converti le resultat en int
quelqu'il soit. Je serais plus précis la prochaine fois ;)

Merci, c'est mieux :)

a++

-----Message d'origine-----
Bonjour à tous,

J'ai un petit pb de cast avec l'opérateur ternaire ?:

Voici le début du code :
Je suis dans un boucle while(dr.read())

int bi20;
int bs20;

bi20 = (dr.IsDBNull(2) ? 0 : dr.GetInt16(2));
bs20 = (dr.IsDBNull(3) ? 0 : dr.GetInt16(3));

Si j'écris ça j'ai une erreur :
Le type d'expression conditionnelle ne peut pas être
déterminé, car 'int' et 'short' exécutent implicitement
une conversion croisée

Je ne comprends pas cette erreur bi20 ou bs20 sont des
int, dans ma base j'ai des integers et ça :

if (dr.IsDBNull(2))
{ bi20 = 0;}
else
{bi20 = dr.GetInt16(2);}

ça marche.

Pourquoi l'opérateur ternaire me casse les pieds avec une
conversion croisée ? Il n'y a pourtant pas d'ambiguité...
Sinon que faut il écrire ?

Merci.
.