Reading reference variable alters said reference variable

So here’s the method:

    public Act[] Orientate(ActionType type, ActionDirection direction)
        Act[] orientatedAct = referenceActions[(int)type].acts;

        foreach (Act _act in orientatedAct)
            Vector2 rotatedOrigin = new Vector2(_act.origin.x, _act.origin.y);
            if (_act.origin.x > -2)
               rotatedOrigin = Quaternion.Euler(0, 0, (90 * -(int)direction)) * new Vector2(_act.origin.x, _act.origin.y);
            Vector2 rotatedDirection = Quaternion.Euler(0, 0, (90 * -(int)direction)) * new Vector2(_act.direction.x, _act.direction.y);
            _act.origin = new Vector2Int(Mathf.RoundToInt(rotatedOrigin.x), Mathf.RoundToInt(rotatedOrigin.y));
            _act.direction = new Vector2Int(Mathf.RoundToInt(rotatedDirection.x), Mathf.RoundToInt(rotatedDirection.y));
        return orientatedAct;

…and for some reason of another, each time I call it, it alters a value within the referenceActions array. referenceActions is a serialized array used for me to define what the actions are. I don’t reference referenceActions anywhere else, so I’m stumped as to why it’s being changed. It seems to apply the rotation to referenceActions[(int)type].acts[0].direction.

Any help is appreciated. Happy to provide more details.

So what is happening is → you are creating a new variable, BUT, you are assigning the new variable to the same memory location as the old one. Meaning when you do this:

 Act[] orientatedAct = referenceActions[(int)type].acts;

they are actually sharing memory locations even if they are not the same variable. For example look at the following little program (you can test in

public static void Main()
		int[] test = new int[]{ 1, 2, 3};
		int[] test2 = test;
		test2[0] = 5;		
		foreach (var item in test)
		//Output --> 5
		//Output -->  2
		//Output -->  3

And that is what is happening to yours. To overcome this you need to create a variable with its own memory space. This can be easily done throught the Clone function:

Act[] orientatedAct = (Act[]) referenceActions[(int)type].acts.Clone();

Hope this helped.