三元运算符中的意外行为

时间:2013-04-20 05:40:02

标签: c# .net

当我将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,但是对于三元组,我得到的是不正确的CLR类型。

不要介意代码以及它正在尝试做什么 - 我很好奇为什么会这样,所以如果有人能解释它,我会很感激。

2 个答案:

答案 0 :(得分:5)

三元(条件)运算符的结果总是单一类型 - 一个/两个选项都被转换为普通类型:

var result = condition ? decimalValue : intValue;

result的类型必须在编译时静态知道。由于从int转换为decimal而非decimal类型被选为整个? :运算符的类型。

所以你可以将整个函数写成(显示自动强制转换):

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

答案 1 :(得分:2)

condition ? decimalValue : intValue;

装置

condition ? decimalValue : (decimal) intValue;

尝试这项工作:(我对C#更陌生,但这项工作是用Java编写的)

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