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?

Était-ce utile?

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 et TZ sont du même type: le résultat est ce type
  • Il y a une conversion implicite de TY en TZ mais pas de TZ en TY : le résultat est de tapez TZ et la conversion est utilisée si la première branche est utilisée.
  • Il y a une conversion implicite de TZ en TY mais pas de TY en TZ : le résultat est de tapez TY 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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top