ExpireDownStreamObjects vs this.Params.Output.Recipients.ExpireSolution

I’m wondering what the difference is between calling ExpireDownStreamObjects and looping through all the Output.Recipients and call ExpireSolution on each one.
in the API doc for ExpireDownStreamObjects it says

Expire all objects that depend on any of the output parameters.


which means that they both do the same thing, but in my testing they aren’t the same, ExpireDownStreamObjects expires/clears my output, causing it to output nothing