代码之家  ›  专栏  ›  技术社区  ›  Jan Zahradník

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

  •  2
  • Jan Zahradník  · 技术社区  · 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 ,而输出 Foo2 ,它使用if语句返回 Int32 为什么?

    1 回复  |  直到 1 年前
        1
  •  4
  •   Joel Coehoorn    1 年前

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

    对于int->十进制转换,这是一种扩展转换(没有信息丢失,因为十进制可以表示所有可能的int值),因此提供了一种隐式转换。但是小数->int转换正在缩小范围(一些信息丢失,甚至可能发生溢出),因此必须使用显式转换。因此,三元表达式的结果被类型化为十进制,而不管条件表达式的真/假是什么。

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

    这两种情况都具有 return 关键字,其中最终结果由方法声明中使用的类型决定。。。但同样,在窄转换的情况下,应该使用显式强制转换。