Why BlueprintAssignable delegates have to be dynamic?

If you look through the engine code (e.g. Actor.h), you will notice that every event dispatcher (aka BlueprintAssignable UPROPERTY) is defined using DECLARE_DYNAMIC_MULTICAST_DELEGATE. When regular delegates are tagged as uproperty, compilation fails with a quite inappropriate error (delegate class not found). The same thing happens with DECLARE_EVENT and related definitions. But why there are no dynamic events? They are multicast delegates, too.

I find this bizarre as well, because the non-dynamic delegates have a BindUFunction() method as well, while that’s the only method available for dynamic delegates, which makes it hard to deal with them when you’re mixing them with non-dynamic delegates since it’s not possible to bind a non-dynamic delegate to a dynamic delegate (the other way is possible using BindUFunction() ).

Dynamic delegates have additional glue code (serialization) generated by UHT which makes them visible in blueprints (red link).
Regular delegates and events are used on native side.