ReSharper Trap „Convert to 'Rückkehr' statement“
-
06-07-2019 - |
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?
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
undTZ
sind vom gleichen Typ: Ergebnis ist, dass Typ - Es gibt eine implizite Konvertierung von
TY
TZ
aber nicht vonTZ
TY
: Das Ergebnis ist vom TypTZ
und die Umwandlung verwendet wird, wenn der erste Zweig verwendet wird .
- Es gibt eine implizite Konvertierung von
TZ
TY
aber nicht vonTY
TZ
: Das Ergebnis ist vom TypTY
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?