如何在不影响操作数的情况下重载按位运算符?

How to overload bitwise operator without affecting operands?

我有以下功能:

    public static Hex operator&(Hex a, Hex b)
    {
        Hex toReturn = a;

        byte aByte = ConvertStringHexToByte(a._value);
        byte bByte = ConvertStringHexToByte(b._value);
        aByte &= bByte;
        toReturn._value = ConvertByteToStringHex(aByte);

        return toReturn;
    }

我没有通过引用传递值,但似乎第一个操作数已更改?

我希望能够做到

c = a&b

没有要更改的 a 或 b。

我哪里出错了?

假设Hex是一个引用类型(一个class),这一行将引用复制到内存中的同一个对象:

Hex toReturn = a;

现在 toReturna 都引用同一个对象。也就是说同一个对象可以通过toReturn或者a.

来变异

您应该创建一个 Hex 的新实例来存储结果。例如:

public static Hex operator&(Hex a, Hex b)
{
    Hex toReturn = new Hex();

    byte aByte = ConvertStringHexToByte(a._value);
    byte bByte = ConvertStringHexToByte(b._value);
    aByte &= bByte;
    toReturn._value = ConvertByteToStringHex(aByte);

    return toReturn;
}