5

It appears in C# you can not override the post decrement operator?

I was "reflectoring" and ran across some code that reflector translated to decimal.op_Decrement(x) and I was trying to figure out whether it meant --x or 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;
    }
}

Does the framework just use the "pre-decrement" version for the "post-decrement" operation?

David
  • 19,389
  • 12
  • 63
  • 87

3 Answers3

13

Postfix ++/-- operator is the same as it's prefix counterpart, except the first creates a copy (if needed) of the variable before assigning.

So, this code:

int x = Function(y--);

Is equal to this code:

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

That's why there is no need to overload the postfix operator.

LiraNuna
  • 64,916
  • 15
  • 117
  • 140
  • Though this explanation clearly expresses the general concept of postfix decrement, it's at odds with EricLippert's detailed explanation of prefix & postfix operators (see http://stackoverflow.com/a/3346729/1245420). If Eric is to be believed, `Function(oldValueOf_y)` is called **AFTER** the variable known as `y` is decremented. What is passed to `Function()` is a copy of `y` before it was decremented. Thus it would seem that in C#, just as in C++, the semantics of postfix increment/decrement prevent obvious optimizations that the compiler may be able to make with prefix increment/decrement. – phonetagger Jun 22 '16 at 19:07
1

Basically, there is no need to make a distinction because:

decimal x = y--;

is equivalent to

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

and

decimal x = --y;

is equivalent to

decimal x;
decimal.op_Decrement(y);
x = y;
cdmckay
  • 31,832
  • 25
  • 83
  • 114
0

It doesn't matter. In the context of the variable being operated on, there's no difference between the prefix and postfix operators. It's only in the context of the calling code that the difference matters.

Michael Petrotta
  • 59,888
  • 27
  • 145
  • 179
  • so it just uses the same "increment" operator, doesn't matter if it's post or pre increment? – David Nov 05 '09 at 04:22