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的话?(可能是三元/条件运算符的某些属性)