Why delegation always forward to the initial value

That’s how the delegation works right now: it copies the reference to the delegate upon creation, and delegates all calls to that reference.

The reason why it doesn’t work another way is simple: it just wasn’t designed/implemented/tested/documented by somebody.

There is a couple of feature requests to make it possible to switch a delegate during lifetime of an object: