Resharper Trap“「return」ステートメントに変換”
-
06-07-2019 - |
質問
次のルーチンを指定します:
private static object ParseNumber(string token, FieldDefinition def)
{
if (def.Fraction > 0)
return Double.Parse(token);
else
return Int64.Parse(token);
}
Resharperは、三項演算子を使用してステートメントにリファクタリングするオプションを提供します。
private static object ParseNumber(string token, FieldDefinition def)
{
return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}
誰がトラップを見つけることができますか?
解決
さて、前の回答に変更してください。 Int64
から Double
への暗黙的な変換があるため(ただしその逆は行われないため)、それが式の結果型になります。したがって、ボックス化された Int64
を取得する場合、実際にはボックス化された Double
を取得します(ただし、元々は Int64.Parse
から取得した値です) 。
それが十分に明確でない場合は、すべての return
ステートメントを変更して、変数を返すようにします。元のコードは次のとおりです。
private static object ParseNumber(string token, FieldDefinition def)
{
if (def.Fraction > 0)
return Double.Parse(token);
else
return Int64.Parse(token);
}
適切に変換する:
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;
}
}
そして、条件演算子を使用したバージョンでも同じことをしましょう:
private static object ParseNumber(string token, FieldDefinition def)
{
return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}
なる
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;
}
編集:要求に応じて、もう少し情報。フォームの条件式のタイプ
X ? Y : Z
Y
と Z
のタイプに依存します。これらは TY
および TZ
と呼びます。いくつかのオプションがあります:
-
TY
とTZ
は同じタイプです。結果はそのタイプです -
TY
からTZ
への暗黙的な変換がありますが、TZ
からTY
への変換はありません:結果はTZ
と入力すると、最初のブランチが使用されている場合は変換が使用されます。 -
TZ
からTY
への暗黙的な変換がありますが、TY
からTZ
への変換はありません:結果はTY
と入力すると、2番目のブランチが使用されている場合は変換が使用されます。 - 両方向に暗黙的な変換があります:コンパイル時エラー
- どちらの方法でも変換はありません:コンパイル時エラー
それは役立ちますか?
所属していません StackOverflow