好的,换成上一个答案。Int64
因为存在从to的隐式转换Double
(但反之亦然),所以这将是表达式的结果类型。因此,当您期望得到一个 boxedInt64
时,您实际上得到了一个 boxed 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
取决于 and 的类型Y
,Z
我将其称为TY
and TZ
。有几个选项:
TY
并且TZ
是同一类型:结果是该类型
TY
有一个从toTZ
但不是 from TZ
to的隐式转换TY
:结果是类型TZ
,如果使用第一个分支,则使用转换。
TZ
有一个从toTY
但不是 from TY
to的隐式转换TZ
:结果是类型TY
,如果使用第二个分支,则使用转换。
- 在两个方向都有一个隐式转换:编译时错误
- 两种方式都没有转换:编译时错误
这有帮助吗?