Trappola resharper "Converti in istruzione" return "
-
06-07-2019 - |
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?
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 ??p>
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
eTZ
sono dello stesso tipo: il risultato è quel tipo - Esiste una conversione implicita da
TY
aTZ
ma non daTZ
aTY
: il risultato è di digitareTZ
e la conversione viene utilizzata se si utilizza il primo ramo. - Esiste una conversione implicita da
TZ
aTY
ma non daTY
aTZ
: il risultato è di digitareTY
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?