恕我直言,我有两段相同的代码(甚至 Rider 建议我用第一个选项缩短第二个代码),但给出了不同的结果(.NET 8)
public static object Foo1()
{
int valTrue = 5;
decimal valFalse = 10m;
return true ? valTrue : valFalse;
}
public static object Foo2()
{
int valTrue = 5;
decimal valFalse = 10m;
if (true)
return valTrue;
else
return valFalse;
}
如果我像这样运行它们:
Console.WriteLine(Foo1().GetType().Name);
Console.WriteLine(Foo2().GetType().Name);
使用三元运算符的
Foo1
的输出返回Decimal
,而使用if语句的Foo2
的输出返回Int32
。这是为什么?
对于第一个选项,如果三元表达式的两个结果的类型不完全匹配,则必须存在从一个到另一个的隐式转换,并且首先选择符合条件的选项。
对于 int -> Decimal 转换,这是一种扩大转换(不会丢失任何信息,因为十进制可以表示所有可能的 int 值),因此提供了隐式转换。但是十进制 -> int 转换正在缩小(一些信息丢失,甚至有可能溢出),因此必须使用显式转换。因此,无论条件表达式的真/假如何,三元表达式的结果都以小数形式输入。
对于第二个选项,我们有多个单独的表达式,因此编译器可以自由地为单独的行使用不同的类型。
这两种情况都具有
return
关键字,其中最终结果由方法声明所使用的类型决定......但同样,在缩小转换的情况下,应使用显式强制转换。