A problem I recently had was the following.
I had a Player object with a Player script attached to it.
My gameobject hierarchy looked something like this:
Player (parent) // Has Player.cs and a RigidBody attached to it.
- GFX // Holds graphics like sprites
- PhysicsHolder // Empty object
- Body // Has a box trigger 2d defining the player body
- Feet // Has a box trigger 2d defining the player feet area
I wanted to handle all the collision events for my player in Player.cs, so they were all in one place. The problem was, it was quite hard to differentiate between whether the Feet object or Body object triggered the call to OnTriggerEnter2D.
If you've set up your hierarchy like I have, both the Body and Feet triggers will call OnTriggerEnter2D in their parent script, and thus will call Player.OnTriggerEnter2D.
In OnCollisionEnter you get a reference to the collider which triggered the call with collision.other. You could then easily set a tag for each respective collider and do collision.other.CompareTag()
Since OnTriggerEnter doesn't have a Collision object as a param but a Collider2D, and a Collider2D doesn't have a reference to other or something similar, you can't do the same in a case where you want to handle a trigger event. Using this.CompareTag() in Player.cs would not suffice either, since you'd be comparing the tag of the parent Player object, and not the Feet or Body object.
I've since found a solution to this problem which I will provide here. Maybe it's of use to any of you who come across this problem.

