恕我直言,我有两段相同的代码(甚至 Rider 建议我用第一个选项缩短第二个代码),但给出了不同的结果(.NET 8)
第一个(结果是小数 - 不正确)
return reader.TryGetInt32(out int i) ? i : reader.GetDecimal();
第二个(结果为整数)
if (reader.TryGetInt32(out int i))
return i;
else
return reader.GetDecimal();
示例存储库在这里 https://github.com/mashbrno/JsonTest
对于第一个选项,如果三元表达式的两个结果的类型不完全匹配,则必须存在从一个到另一个的隐式转换,并且首先选择符合条件的选项。
在 int ->decimal 转换的情况下,这是加宽转换(不会丢失信息),因此提供了隐式转换。但是十进制 -> int 转换正在缩小(一些信息丢失,甚至有可能溢出),因此必须使用显式转换。因此,无论条件表达式的真/假,表达式的结果都是小数。
对于第二个选项,我们有多个表达式,因此编译可以自由地为单独的行使用不同的类型。
这两种情况都具有
return
关键字,其中最终结果由方法声明所使用的类型决定...但同样,在缩小转换的情况下,应使用显式强制转换。