4

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

2 番目の行は両方のゲッターで Int32 を出力すると予想されますが、3 進数の場合、int に対して正しくない CLR 型が返されます。

コードとそれが何をしようとしているのかは気にしないでください-なぜこれが起こっているのか興味があるので、誰かがそれを説明できるなら、私は感謝します.

4

2 に答える 2