質問

次のルーチンを指定します:

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番目のブランチが使用されている場合は変換が使用されます。
  • 両方向に暗黙的な変換があります:コンパイル時エラー
  • どちらの方法でも変換はありません:コンパイル時エラー

それは役立ちますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top