给出以下例程:

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

谁能发现陷阱?

有帮助吗?

解决方案

好吧,改回之前的答案。因为有一个隐式转换 Int64Double (但反之则不然),这将是表达式的结果类型。因此,当您希望收到盒装产品时 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

取决于类型 YZ, ,我称之为 TYTZ. 。有以下几种选择:

  • TYTZ 是同一类型:结果是那种类型
  • 有一个隐式转换 TYTZ 但不是来自 TZTY: :结果是类型 TZ 如果使用第一个分支,则使用转换。
  • 有一个隐式转换 TZTY 但不是来自 TYTZ: :结果是类型 TY 如果使用第二个分支,则使用转换。
  • 两个方向都有隐式转换:编译时错误
  • 无论哪种方式都没有转换:编译时错误

这有帮助吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top