好的,换成上一个答案。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我将其称为TYand TZ。有几个选项:
TY并且TZ是同一类型:结果是该类型
TY有一个从toTZ但不是 from TZto的隐式转换TY:结果是类型TZ,如果使用第一个分支,则使用转换。
TZ有一个从toTY但不是 from TYto的隐式转换TZ:结果是类型TY,如果使用第二个分支,则使用转换。
- 在两个方向都有一个隐式转换:编译时错误
- 两种方式都没有转换:编译时错误
这有帮助吗?