Rau*_*otz 6 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);
}
Run Code Online (Sandbox Code Playgroud)
Resharper为我提供了将其重构为三元运算符的声明的选项:
private static object ParseNumber(string token, FieldDefinition def)
{
return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}
Run Code Online (Sandbox Code Playgroud)
谁能发现陷阱?
Jon*_*eet 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);
}
Run Code Online (Sandbox Code Playgroud)
恰当地转换:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在让我们对带有条件运算符的版本做同样的事情:
private static object ParseNumber(string token, FieldDefinition def)
{
return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}
Run Code Online (Sandbox Code Playgroud)
变
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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据要求,更多信息.表单的条件表达式的类型
X ? Y : Z
Run Code Online (Sandbox Code Playgroud)
依赖于类型的Y和Z,我会打电话TY和TZ.有几个选择:
TY并且TZ是相同的类型:结果是该类型TY到TZ但不能从TZ到TY:结果的类型的TZ,并且如果使用第一分支使用的转换.TZ到TY但不能从TY到TZ:结果的类型的TY,并且如果使用第二分支使用的转换.这有帮助吗?