Diferencia de sobrecarga de C # postfix e incremento / decremento de prefijo

La mayoría de las fuentes dicen que la sobrecarga de los operadores ++ y - en c # da como resultado una sobrecarga de ambos, postfix y prefijo a la vez. Pero parece que su comportamiento sigue siendo diferente.

class Counter
{
    public Counter(int v = 0)
    {
        this.v = v;
    }
    public Counter(Counter c)
    {
        v = c.v;
    }
    public int GetValue() { return v; }
    public static Counter operator ++(Counter c)
    {
        c.v++;
        return new Counter(c);
    }
    private int v;
}


class Program
{
    public static void Main()
    {
        Counter c1 = new Counter(1);

        Counter c2 = c1++;

        Counter c3 = ++c1;

        c3++;

        System.Console.WriteLine("c1 = {0}", c1.GetValue());
        System.Console.WriteLine("c2 = {0}", c2.GetValue());
        System.Console.WriteLine("c3 = {0}", c3.GetValue());
    }
}

Maravillosamente, aunque sobrecargadooperator ++ Devuelve copia de la clase original, en este ejemplo.c1 yc3 se convierte en referencias al mismo objeto, mientras quec2 apunta a una diferente (c1=4, c2=2, c3=4 aquí). CambiandoCounter c3 = ++c1; aCounter c3 = c1++; salidasc1=3, c2=2, c3=4.

Entonces, ¿cuál es la diferencia exacta entre postfix e incremento / decremento de prefijo y cómo afecta la sobrecarga? ¿Estos operadores actúan de la misma manera para las clases y para los tipos primitivos?