Frage

In Anbetracht der folgenden Routine:

private static object ParseNumber(string token, FieldDefinition def)
{
  if (def.Fraction > 0)
    return Double.Parse(token);
  else
    return Int64.Parse(token);
}

ReSharper bieten mir die Möglichkeit, es in eine Erklärung mit dem ternären Operator Refactoring:

private static object ParseNumber(string token, FieldDefinition def)
{
  return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}

Wer die Falle erkennen kann?

War es hilfreich?

Lösung

Okay, Veränderung zur vorherige Antwort. Da es eine implizite Konvertierung von Int64 ist zu Double (aber nicht umgekehrt), das wird der Ergebnistyp des Ausdrucks sein. Also, wenn Sie ein Box-Int64 erhalten erwarten, man bekommt tatsächlich einen Boxed Double (aber mit einem Wert, der ursprünglich aus Int64.Parse kam).

Nur für den Fall, dass nicht klar genug ist, lassen Sie uns alle return Aussagen ändern, so dass sie nur eine Variable zurück. Hier ist der ursprüngliche Code:

private static object ParseNumber(string token, FieldDefinition def)
{
  if (def.Fraction > 0)
    return Double.Parse(token);
  else
    return Int64.Parse(token);
}

konvertieren, die in geeigneter Weise:

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;
  }
}

Und nun lassen Sie sich auf die Version mit dem bedingten Operator das gleiche tun:

private static object ParseNumber(string token, FieldDefinition def)
{
  return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}

wird

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: Wie gewünscht, ein bisschen mehr Informationen. Die Art eines bedingten Ausdruck der Form

X ? Y : Z

hängt von der Art von Y und Z, die ich TY und TZ nennen würde. Es gibt ein paar Optionen:

  • TY und TZ sind vom gleichen Typ: Ergebnis ist, dass Typ
  • Es gibt eine implizite Konvertierung von TY TZ aber nicht von TZ TY: Das Ergebnis ist vom Typ TZ und die Umwandlung verwendet wird, wenn der erste Zweig verwendet wird
  • .
  • Es gibt eine implizite Konvertierung von TZ TY aber nicht von TY TZ: Das Ergebnis ist vom Typ TY und die Umwandlung verwendet wird, wenn der zweite Zweig verwendet wird
  • .
  • Es gibt eine implizite Konvertierung in beiden Richtungen: Kompilierzeitfehler
  • Es sind keine Umbauten oder so: Fehler bei der Kompilierung

Ist diese Hilfe?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top