2009-11-05 2 views
4

В C# вы не можете переопределить оператор пост декремента?Перегрузка операторов ++ и - C#

Я был «отражением» и натолкнулся на какой-то код, отражающий рефлектор на decimal.op_Decrement(x), и я пытался выяснить, имеет ли он значение --x или x--.

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; 
    } 
} 

Является ли каркас просто использующим версию «до декремента» для операции «после декремента»?

ответ

11

Postfix ++/-- Оператор такой же, как и его префиксный экземпляр, за исключением того, что первый создает копию (при необходимости) переменной перед назначением.

Таким образом, этот код:

int x = Function(y--); 

Равен этот код:

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

Вот почему нет никакой необходимости перегружать оператор постфикса.

+0

+1 Ясный, простой и хорошо объясненный, приятный! – Abel

+0

Хотя это объяснение ясно выражает общую концепцию постфиксального декремента, это противоречит подробному объяснению операторов префикса и постфикса EricLippert (см. Http://stackoverflow.com/a/3346729/1245420). Если полагать Эрика, 'Function (oldValueOf_y)' вызывается ** ПОСЛЕ **, переменная, известная как 'y', уменьшается. То, что передано 'Function()', является копией 'y' до того, как оно уменьшилось. Таким образом, казалось бы, что в C#, как и в C++, семантика постфиксного приращения/декремента предотвращает очевидные оптимизации, которые компилятор может сделать с приращением/уменьшением префикса. – phonetagger

0

Это не имеет значения. В контексте используемой переменной нет никакой разницы между префиксными и постфиксными операторами. Только в контексте вызывающего кода разница имеет значение.

+0

, поэтому он просто использует один и тот же оператор «increment», не имеет значения, является ли сообщение post или pre increment? – Dave

+0

@ Давай, да, это так. –

1

В принципе, нет необходимости делать различие, потому что:

decimal x = y--; 

эквивалентно

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

и

decimal x = --y; 

эквивалентно

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