Domanda

Data la seguente routine:

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

Resharper mi offre la possibilità di trasformarlo in una dichiarazione con l'operatore ternario:

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

Chi può individuare la trappola?

È stato utile?

Soluzione

Va ??bene, passa alla risposta precedente. Poiché esiste una conversione implicita da Int64 a Double (ma non viceversa), questo sarà il tipo di risultato dell'espressione. Quindi, quando ti aspetti di ottenere un Int64 in scatola, ottieni effettivamente un Double in scatola (ma con un valore originariamente derivato da Int64.Parse ) .

Nel caso in cui ciò non sia abbastanza chiaro, cambiamo tutte le istruzioni return in modo che restituiscano semplicemente una variabile. Ecco il codice originale:

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

Converti in modo appropriato:

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

E ora facciamo lo stesso con la versione con l'operatore condizionale:

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

diventa

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: come richiesto, un po 'più di informazioni. Il tipo di un'espressione condizionale del modulo

X ? Y : Z

dipende dai tipi di Y e Z , che chiamerò TY e TZ . Ci sono alcune opzioni:

  • TY e TZ sono dello stesso tipo: il risultato è quel tipo
  • Esiste una conversione implicita da TY a TZ ma non da TZ a TY : il risultato è di digitare TZ e la conversione viene utilizzata se si utilizza il primo ramo.
  • Esiste una conversione implicita da TZ a TY ma non da TY a TZ : il risultato è di digitare TY e la conversione viene utilizzata se si utilizza il secondo ramo.
  • Esiste una conversione implicita in entrambe le direzioni: errore di compilazione
  • Non ci sono conversioni in entrambi i modi: errore di compilazione

Aiuta?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top