Error CS1612

I understand that others have had this problem and the answers I am seeing are stating that I need to make a temporary variable that effects whatever I need to edit. However, I am doing this and still getting the same error.

void StopBall ()
{
	if (rigidbody.velocity.x <= stopVelocityThreshold.x && rigidbody.velocity.x != 0f) {
		float tempX = 0;

		//Error occurs here
		rigidbody.velocity.x = tempX;

		Debug.Log("X Velocity Stopped");
	}
	if (rigidbody.velocity.z <= stopVelocityThreshold.z && rigidbody.velocity.z != 0f) {
		float tempZ = 0;

		//Error occurs here
		rigidbody.velocity.z = tempZ;

		Debug.Log("Z Velocity Stopped");
	}
	if (rigidbody.velocity == Vector3.zero) {
		CancelInvoke();
	}
}

I don’t understand what I am doing wrong. Any help would be appreciated.

@BenLuker The velocity property retrieved in this way must be assigned to a variable before its contents can be modified - its a C# thing for assignment of value types using copies not reference to original.

A couple of options

  1. Create a Vector3 variable to hold the vector, modify as needed and reassign back to rigidbody

    Vector3 ballVelocity = rigidbody.velocity;
    ballVelocity.x = 0; //or also update ballVelocity.y, ballVelocity.z if needed
    rigidbody.velocity = ballVelocity;

  2. Use rigidbody.velocity.Set(x,y,z) method instead. So, if only changing x value:

    rigidbody.velocity.Set(0, rigidbody.velocity.y, rigidbody.velocity.z);
    Note, Unity recommends, in most cases, to not modify velocity vector of a rigidbody as it can interfere with the physics simulations. https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html