I don't seem to be making myself clear. The hack is no longer in our code (it was a temporary measure while the rest of our UI code was being refactored). There is no longer any need to break this consistency. There is no problem I need help solving here.
I'm providing feedback, suggesting that your API contract for EventDelegate,
All callbacks must be in the same state as whatever class you have them registered with (scroll bar in this case).
could be a little more flexible for the sake of usability and consistency with how .Net delegates behave.
Right now if someone, either inadvertently or through deliberate recklessness (that would be me

), does this little add/change/remove dance or any variation on it, there's a fairly strong chance that Unity will get caught in an infinite event dispatching loop and lock up.
How do you stop it from locking up? The answer is obviously, "Don't do that." Unfortunately, that doesn't really help someone once they've gotten themselves into this mess. That also doesn't mean that NGUI shouldn't be made resilient to this kind of silly user behavior.
I think making the EventDelegate.Execute immune to this problem is the right approach, but it's also reasonable for NGUI to detect the loop, stop executing callbacks, and throw an exception.
It's just a suggestion. Take it or leave it.