2011-05-05 43 views
1
public static MyClass operator++(MyClass op) 
{ 
    MyClass result = new MyClass(); // MyClass() x=y=z=0; 

    result.x = op.x + 1; 
    result.y = op.y + 1; 
    result.z = op.z + 1; 

    return result: 
} 

//... 

public void Main() 
{ 
    MyClass c = new MyClass(); 
    MyClass b = new MyClass(1,2,3); //ctor x = 1, ... 
    c = b++; 
} 

問題是爲什麼變量b會改變? 因爲result.x = op.x + 1;不應該改變op.x 結果實際上是c(1,2,3)b(2,3,4) 我不明白爲什麼不c(2,3,4)b(1,2,3)重載++ C#

回答

0

你說,「因爲result.x = op.x + 1不應該改變op.x 「。但是++不是+ 1相同。它是標準後綴增量運算符,它通過使用自定義過載增加操作數b - 它在之後將新值立即分配給b將前一個值傳遞給c。如果它是前綴運算符(++b),則在將值傳遞給c之前,它將增加

沒有在所有任何重載,代碼:

b++ 

等同於:

b = b + 1 

而且

c = b++ 

等同於:

c = b; 
b = b + 1; 

現在用您的過載,它更相當於:你所描述的

c = b; 
b = call_your_++_overload(b); 
+0

但我在這裏使用它時,「++」重載。 「c = b ++」因此C#自動從基礎「++」中添加非重載函數? – Nikita 2011-05-05 20:10:38

+0

@尼基塔,是的,它超載 - 所以它使用你的代碼;但語義是相同的。 – 2011-05-05 20:16:16

+0

+1只要我的答案票復活,哈哈。很好的答案。 :) – 2011-05-05 20:19:34

0

行爲是根據documentation:

後綴遞增操作 - 操作的 結果是價值 操作數在 之前遞增。

b++(後綴運算符)和++b(前綴運算符)都會更改原始變量。爲了得到想要的結果,我建議超載+運營商,並將c = b++;更改爲c = b + 1;