Piège de resharpement & # 8220; Convertir en instruction 'de retour' & # 8221;
-
06-07-2019 - |
Question
Avec la routine suivante:
private static object ParseNumber(string token, FieldDefinition def)
{
if (def.Fraction > 0)
return Double.Parse(token);
else
return Int64.Parse(token);
}
Resharper m'offre la possibilité de le reformater en une déclaration avec l'opérateur ternaire:
private static object ParseNumber(string token, FieldDefinition def)
{
return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}
Qui peut repérer le piège?
La solution
D'accord, passez à la réponse précédente. Puisqu'il existe une conversion implicite de Int64
en Double
(mais pas l'inverse), ce sera le type de résultat de l'expression. Ainsi, lorsque vous vous attendez à obtenir un Int64
encadré, vous obtenez un Double
encadré (mais avec une valeur provenant à l'origine de Int64.Parse
). .
Au cas où cela ne serait pas assez clair, changeons toutes les instructions return
afin qu'elles ne renvoient qu'une variable. Voici le code original:
private static object ParseNumber(string token, FieldDefinition def)
{
if (def.Fraction > 0)
return Double.Parse(token);
else
return Int64.Parse(token);
}
Convertissez-le de manière appropriée:
private static object ParseNumber(string token, FieldDefinition def)
{
if (def.Fraction > 0)
{
double d = Double.Parse(token);
object boxed = d; // Result is a boxed Double
return boxed;
}
else
{
long l = Int64.Parse(token);
object boxed = l; // Result is a boxed Int64
return boxed;
}
}
Et maintenant, faisons la même chose avec la version avec l'opérateur conditionnel:
private static object ParseNumber(string token, FieldDefinition def)
{
return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}
devient
private static object ParseNumber(string token, FieldDefinition def)
{
// The Int64.Parse branch will implicitly convert to Double
double d = def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
object boxed = d; // *Always* a Double
return boxed;
}
EDIT: Comme demandé, un peu plus d'informations. Le type d'une expression conditionnelle de la forme
X ? Y : Z
dépend des types de Y
et de Z
, que j'appellerai TY
et TZ
. Il y a quelques options:
-
TY
etTZ
sont du même type: le résultat est ce type - Il y a une conversion implicite de
TY
enTZ
mais pas deTZ
enTY
: le résultat est de tapezTZ
et la conversion est utilisée si la première branche est utilisée. - Il y a une conversion implicite de
TZ
enTY
mais pas deTY
enTZ
: le résultat est de tapezTY
et la conversion est utilisée si la deuxième branche est utilisée. - Il existe une conversion implicite dans les deux sens: erreur lors de la compilation
- Il n'y a pas de conversion dans les deux cas: erreur de compilation
Est-ce que cela vous aide?