Animation error at state speed change

I have a simple empty game object with the “Clamp Forever” wrap mode animation and a script to control the speed which causes an error.

The code to reproduce:

	void Update () {
		if (Input.GetKeyDown(KeyCode.B)) {
			foreach (AnimationState state in animation) {
				state.speed = 1.0f;
			}
			animation.Play();
		}
		if (Input.GetKeyUp(KeyCode.B)) {
			foreach (AnimationState state in animation) {
				state.speed = -1.0f;
			}
			animation.Play();
		}
	}

The animation error message:

oldWrappedTime < newWrappedTime

Assert in file: C:/BuildAgent/work/a0f11f3559d72c6d/Runtime/AnimationState.cpp at line : 259

I have found a solution.
But please explain the internals or a better solution if you can.
Meanwhile, I use the following script code with calling the lower methods as animation events.

	void Update () {
		if (Input.GetKeyDown(KeyCode.B)) {
			foreach (AnimationState state in animation) {
				state.speed = 1;
			}
			animation.Play(PlayMode.StopSameLayer);
		}
		if (Input.GetKeyUp(KeyCode.B)) {
			foreach (AnimationState state in animation) {
				state.speed = -1;
			}
			animation.Play(PlayMode.StopSameLayer);
		}
	}
	
	void OnAnimationBeginningReached() {
		foreach (AnimationState state in animation) {
			if (state.speed==-1) { state.speed = 0; }
		}
	}
	
	void OnAnimationEndingReached() {
		foreach (AnimationState state in animation) {
			if (state.speed==1) { state.speed = 0; }
		}
	}