C# 三元运算符的意外结果

问题描述 投票:0回答:1

恕我直言,我有两段相同的代码(甚至 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

c#
1个回答
0
投票

对于第一个选项,如果三元表达式的两个结果的类型不完全匹配,则必须存在从一个到另一个的隐式转换,并且首先选择符合条件的选项。

在 int ->decimal 转换的情况下,这是加宽转换(不会丢失信息),因此提供了隐式转换。但是十进制 -> int 转换正在缩小(一些信息丢失,甚至有可能溢出),因此必须使用显式转换。因此,无论条件表达式的真/假,表达式的结果都是小数。

对于第二个选项,我们有多个表达式,因此编译可以自由地为单独的行使用不同的类型。

这两种情况都具有

return
关键字,其中最终结果由方法声明所使用的类型决定...但同样,在缩小转换的情况下,应使用显式强制转换。

© www.soinside.com 2019 - 2024. All rights reserved.