三元运算符中出现意外行为

本文关键字:意外 运算符 三元 | 更新日期: 2023-09-27 18:10:02

当我为return语句将if-else改为三元运算符时,我遇到了一个奇怪的行为。

我在这里简化了代码:

class Foo
{
    private bool condition;
    private int intValue = 1;
    private decimal decimalValue = 1M;
    public object TernaryGet
    {
        get
        {
            return condition ? decimalValue : intValue;
        }
    }
    public object IfElseGet
    {
        get
        {
            if (condition)
                return decimalValue;
            return intValue;
        }
    }
    public Foo(bool condition)
    {
        this.condition = condition;
    }
}
class Program
    {
        static void Main(string[] args)
        {
            var fooTrue = new Foo(true);
            var fooFalse = new Foo(false);
            Console.WriteLine("{0}, {1}", fooTrue.TernaryGet.GetType(), fooTrue.IfElseGet.GetType());
            Console.WriteLine("{0}, {1}", fooFalse.TernaryGet.GetType(), fooFalse.IfElseGet.GetType());
        }        
    }

其输出为:

System.Decimal, System.Decimal
System.Decimal, System.Int32

我希望第二行在两个getter上都输出Int32,但对于三进制,我为int返回了不正确的CLR类型。

别管代码和它试图做什么-我很好奇为什么会发生这种情况,所以如果有人能解释一下,我会很感激。

三元运算符中出现意外行为

三元(条件(运算符的结果总是单一类型-其中一个/两个选项被强制转换为通用类型:

var result = condition ? decimalValue : intValue;

result的类型在编译时必须是静态已知的。由于存在从intdecimal的转换,因此选择decimal类型作为整个? :运算符的类型。

所以你的整个函数可以写成(显示自动转换(:

public object TurnaryGet
{
    get
    {
        /*decimal*/ var result = condition ? decimalValue : (decimal)intValue;
        return (object)result;
    }
}
condition ? decimalValue : intValue;

condition ? decimalValue : (decimal) intValue;

试试这个是否有效:(我对C#不熟悉,但它在Java中有效(

condition ? (object) decimalValue : (object) intValue;