考虑以下例程:
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);
}
谁能发现陷阱?
答案 0 :(得分:11)
好的,转到上一个答案。因为存在从Int64
到Double
的隐式转换(但反之亦然),这将是表达式的结果类型。因此,当您希望得到一个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
取决于Y
和Z
的类型,我将其称为TY
和TZ
。有几个选择:
TY
和TZ
属于同一类型:结果是该类型TY
到TZ
进行隐式转换,但不是从TZ
转换为TY
:结果属于TZ
类型,并且如果使用了第一个分支。TZ
到TY
进行隐式转换,但不是从TY
转换为TZ
:结果属于TY
类型,并且如果使用第二个分支。这有帮助吗?