关于c#:当++运算符重载时,为什么++ foo和foo ++没有区别?

Why is there no difference in ++foo and foo++ when the ++ operator is overloaded?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Post-increment Operator Overloading
Why are Postfix ++/— categorized as primary Operators in C#?

我看到我可以超载++--的操作。通常使用这些运算符的方式有两种。递增/递减整型前后例子:

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

但是当涉及到运算符重载时,情况有点不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    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

解决方案是将操作员过载改为:

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


前缀与后缀++的区别在于,foo++的值是在调用++操作符之前foo的值,而++foo++操作符返回的值。在您的示例中,这两个值是相同的,因为++运算符返回原始fly引用。相反,如果它返回一个新的"飞行"飞行,那么你会看到你期望的不同。