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 ?
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 ?
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 ?
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.
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())
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.
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" <Cirfain@discussions.microsoft.com> a écrit dans le message de
news: 338d01c521a3$96c02d90$a501280a@phx.gbl...
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())
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 ?
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())
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.
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())
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. .
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())
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 ?
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())
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 ?