4

重複の可能性:
ポストインクリメント演算子のオーバーロード
なぜPostfix ++ / —がC#のプライマリ演算子として分類されるのですか?

++--演算子をオーバーロードできることを確認しました。通常、これらの演算子は2つの方法で使用します。intのインクリメント/デクリメントの前後の例:

int b = 2; 
//if i write this
Console.WriteLine(++b); //it outputs 3
//or if i write this
Console.WriteLine(b++); //outpusts 2

ただし、演​​算子のオーバーロードに関しては、状況が少し異なります。

    class Fly
    {
        private string Status { get; set; }

        public Fly()
        {
            Status = "landed";
        }

        public override string ToString()
        {
            return "This fly is " + Status;
        }

        public static Fly operator ++(Fly fly)
        {
            fly.Status = "flying";
            return fly;
        }
    }


    static void Main(string[] args)
    {
        Fly foo = new Fly();

        Console.WriteLine(foo++); //outputs flying and should be landed
        //why do these 2 output the same?
        Console.WriteLine(++foo); //outputs flying
    }

私の質問は、これらの最後の2行が同じものを出力するのはなぜですか?さらに具体的には、(2つの)最初の行が出力されるのはなぜflyingですか?


解決策は、演算子のオーバーロードを次のように変更することです。

        public static Fly operator ++(Fly fly)
        {
            Fly result = new Fly {Status = "flying"};
            return result;
        }
4

1 に答える 1

4

プレフィックスとポストフィックスの違いは++、の値が演算子を呼び出す前foo++の値であるのに対し、は演算子が返した値であるということです。あなたの例では、演算子が元の参照を返すため、これら2つの値は同じです。代わりに、新しい「フライング」フライが返された場合は、期待する違いがわかります。foo++++foo++++fly

于 2012-11-13T17:33:36.693 に答える