首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Resharper Trap“转换为'return‘语句”

Resharper Trap“转换为'return‘语句”
EN

Stack Overflow用户
提问于 2009-03-09 17:17:24
回答 1查看 5.2K关注 0票数 6

给定以下例程:

代码语言:javascript
复制
private static object ParseNumber(string token, FieldDefinition def)
{
  if (def.Fraction > 0)
    return Double.Parse(token);
  else
    return Int64.Parse(token);
}

Resharper为我提供了使用三元运算符将其重构为语句的选项:

代码语言:javascript
复制
private static object ParseNumber(string token, FieldDefinition def)
{
  return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}

谁能发现陷阱?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-03-09 17:26:12

好的,改成之前的答案。因为存在从Int64Double的隐式转换(反之亦然),所以这将是表达式的结果类型。所以当你想得到一个盒装的Int64时,你实际上得到了一个盒装的Double (但是它的值最初来自Int64.Parse)。

为了防止这一点不够清楚,让我们更改所有return语句,使它们只返回一个变量。以下是原始代码:

代码语言:javascript
复制
private static object ParseNumber(string token, FieldDefinition def)
{
  if (def.Fraction > 0)
    return Double.Parse(token);
  else
    return Int64.Parse(token);
}

适当地转换一下:

代码语言:javascript
复制
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;
  }
}

现在让我们使用条件运算符对版本执行相同的操作:

代码语言:javascript
复制
private static object ParseNumber(string token, FieldDefinition def)
{
  return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}

变成了

代码语言:javascript
复制
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;
}

编辑:根据要求,提供更多信息。格式的条件表达式的类型

代码语言:javascript
复制
X ? Y : Z

这取决于YZ的类型,我称之为TYTZ。有几个选项:

  • TY和used.
  • There's是同一类型:TZ类型为
  • 存在从TYTZ的隐式转换,而不是从TZTY的隐式转换:结果为TZ类型,如果第一个分支是TZ到<代码>D29但不是从D30到<代码>D31的隐式转换,则使用该转换:结果为D32类型,如果使用第二个分支,则使用该转换。H233H134>在两个方向上都有一个隐式转换:编译时错误
  • 这两个方向都没有转换:编译时错误

这有帮助吗?

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/627172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档