当++运算符重载时,为什么++ foo和foo ++没有区别?

时间:2012-11-13 17:24:58

标签: c# operator-overloading increment post-increment pre-increment

  

可能重复:
  Post-increment Operator Overloading
  Why are Postfix ++/— categorized as primary Operators in 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
    }

我的问题是为什么这两个最后一行输出相同的东西?更具体地说,为什么第一行(两个)输出flying


解决方案是将运算符重载更改为:

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

1 个答案:

答案 0 :(得分:4)

前缀和后缀++之间的区别在于foo++的值是调用foo运算符之前++的值,而++foo++运算符返回的值。在您的示例中,这两个值是相同的,因为++运算符返回原始fly引用。如果它返回“飞行”飞,那么你会看到你期望的差异。