为什么返回类型会根据我是否使用三元运算符而改变?

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

恕我直言,我有两段相同的代码(甚至 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
。这是为什么?

c#
1个回答
2
投票

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

对于 int -> Decimal 转换,这是一种扩大转换(不会丢失任何信息,因为十进制可以表示所有可能的 int 值),因此提供了隐式转换。但是十进制 -> int 转换正在缩小(一些信息丢失,甚至有可能溢出),因此必须使用显式转换。因此,无论条件表达式的真/假如何,三元表达式的结果都以小数形式输入。

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

这两种情况都具有

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

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