C# “再竖琴陷阱”;转换为';返回';声明;

C# “再竖琴陷阱”;转换为';返回';声明;,c#,resharper,ternary-operator,C#,Resharper,Ternary Operator,鉴于以下惯例: 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(stri

鉴于以下惯例:

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);
}
private static object ParseNumber(string token, FieldDefinition def)
{
  return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}

谁能发现陷阱?

好的,换成前面的答案。因为有一个从
Int64
Double
的隐式转换(但不是相反),这将是表达式的结果类型。因此,当您希望得到一个装箱的
Int64
时,您实际上得到了一个装箱的
双精度
(但其值最初来自
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)
{
  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
    ,如果使用第二个分支,则使用转换
  • 在两个方向上都有一个隐式转换:编译时错误
  • 两种方式都没有转换:编译时错误

这有帮助吗?

我在CodeProject上发布了大约6个月。事实上,一个整数隐式地是一个double是很可怕的,尽管它的精度不高。你能不能补充一两句关于为什么会隐式地转换为double的话?(可能是三元/条件运算符的某些属性)