加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Resharper陷阱“转换为’返回’声明”

发布时间:2020-12-15 08:39:42 所属栏目:百科 来源:网络整理
导读:鉴于以下例程: private static object ParseNumber(string token,FieldDefinition def){ if (def.Fraction 0) return Double.Parse(token); else return Int64.Parse(token);} Resharper为我提供了将其重构为三元运算符的声明的选项: private static objec
鉴于以下例程:
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).

如果不够清楚,让我们改变所有的返回语句,使它们只返回一个变量.这是原始代码:

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类型,如果使用第二个分支则使用转换.
>两个方向都有隐式转换:编译时错误
>无论如何都没有转换:编译时错误

这有帮助吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读