Resharper 陷阱“转换为‘返回’语句”
-
06-07-2019 - |
题
给出以下例程:
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
).
以防万一还不够清楚,让我们更改所有 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
如果使用第二个分支,则使用转换。 - 两个方向都有隐式转换:编译时错误
- 无论哪种方式都没有转换:编译时错误
这有帮助吗?
不隶属于 StackOverflow