2009-11-05 93 views
4

它出現在C#中,您不能重寫後減量運算符?在c中重載++和 - 運算符#

我是「反射式」,碰到一些代碼反射器翻譯爲decimal.op_Decrement(x),我試圖弄清楚這是否意味着--xx--

public struct IntWrapper 
{ 
    public static IntWrapper operator --(IntWrapper value) 
    { 
     return new IntWrapper(value.value - 1); 
    } 

    public static IntWrapper operator (IntWrapper value)-- 
    { 
     ??? 
    } 

    private int value; 

    public IntWrapper(int value) 
    { 
     this.value = value; 
    } 
} 

該框架是否使用「pre-decrement」版本的「後減」操作?

回答

11

後綴++/--運算符與前綴對應項相同,除了第一個在賦值之前創建該變量的副本(如果需要)。

所以,此代碼:

int x = Function(y--); 

等於該代碼:

int x = Function(y); 
--y; 

這就是爲什麼沒有必要重載後綴運算符。

+0

+1清晰,簡單,很好的解釋,很好! – Abel

+0

雖然此解釋清楚地表達了postfix遞減的一般概念,但它與EricLippert對前綴&後綴運算符的詳細解釋不一致(請參閱http://stackoverflow.com/a/3346729/1245420)。如果可以相信Eric,則調用Function(oldValueOf_y)** ** AFTER **時,稱爲「y」的變量遞減。傳遞給'Function()'的函數是遞減前的'y'的一個副本。因此,在C#中,就像在C++中一樣,後綴增量/減量的語義可以防止編譯器可以使用前綴增量/減量進行明顯的優化。 – phonetagger

0

沒關係。在正在操作的變量的上下文中,前綴和後綴運算符沒有區別。只是在調用代碼的上下文中,差異很重要。

+0

所以它只是使用相同的「增量」運算符,無論是後置還是前置增量? – Dave

+0

@Dave,是的,沒錯。 –

1

基本上,沒有必要做出區別,因爲:

decimal x = y--; 

相當於

decimal x = y; 
decimal.op_Decrement(y); 

decimal x = --y; 

等同於

decimal x; 
decimal.op_Decrement(y); 
x = y;