当前位置:  开发笔记 > 编程语言 > 正文

Resharper陷阱"转换为'返回'声明"

如何解决《Resharper陷阱"转换为'返回'声明"》经验,为你挑选了1个好方法。

鉴于以下例程:

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

谁能发现陷阱?



1> Jon Skeet..:

好的,改为上一个答案.因为有从隐式转换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.有几个选择:

TY并且TZ是相同的类型:结果是该类型

这里有一个隐式转换从TYTZ但不能从TZTY:结果的类型的TZ,并且如果使用第一分支使用的转换.

这里有一个隐式转换从TZTY但不能从TYTZ:结果的类型的TY,并且如果使用第二分支使用的转换.

两个方向都有隐式转换:编译时错误

无论如何都没有转换:编译时错误

这有帮助吗?

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有