给定以下例程:
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);
}谁能发现陷阱?
发布于 2009-03-09 17:26:12
好的,改成之前的答案。因为存在从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和used.TZ类型为TY到TZ的隐式转换,而不是从TZ到TY的隐式转换:结果为TZ类型,如果第一个分支是TZ到<代码>D29但不是从D30到<代码>D31的隐式转换,则使用该转换:结果为D32类型,如果使用第二个分支,则使用该转换。H233H134>在两个方向上都有一个隐式转换:编译时错误这有帮助吗?
https://stackoverflow.com/questions/627172
复制相似问题