2 Answers
2

It will work fully recursive unless the outermost exception decides to override ToString() without calling the base version. Then of course the method returns whatever the overridden version decides to return. Developers are therefore highly discouraged from overriding ToString in their own exceptions in order to keep the behavior of calling ToString() on an exception predictable.

By the way, it does not matter if any of the inner exceptions overrides ToString() because during the recursion the public (virtual) ToString() method is not used. Instead a private method ToString(bool) is invoked which does all the work and calls itself on the inner exception if necessary.