-6ren">
gpt4 book ai didi

c# - Resharper Trap "Convert to ' return'语句”

转载 作者:太空狗 更新时间:2023-10-29 21:07:37 25 4
gpt4 key购买 nike

给定以下例程:

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

谁能识破陷阱?

最佳答案

好的,改回之前的回答。因为存在从 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。有几个选项:

  • TYTZ 是同一个类型:结果就是那个类型
  • 存在从 TYTZ 但不是从 TZTY 的隐式转换:结果是键入 TZ,如果使用第一个分支,则使用转换。
  • 存在从 TZTY 但不是从 TYTZ 的隐式转换:结果是键入 TY,如果使用第二个分支,则使用转换。
  • 双向隐式转换:编译时错误
  • 两种方式都没有转换:编译时错误

这有帮助吗?

关于c# - Resharper Trap "Convert to ' return'语句”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/627172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com