I think the wording of this page needs some work. "to explicitly release unmanaged
resources in conjunction with the garbage collector"? This interface works completely independently of the garbage collector.
It can be mixed in with a finalizer, but the most up-to-date advice (since 2005!) about finalizers is that you should very rarely need to write one, thanks to SafeHandle. And yet every page about IDisposable presents an example with a finalizer, as if that were the normal situation.
As a result of this, there is widespread confusion (look at any programming Q&A forum), with people claiming that any IDisposable object MUST have a finalizer, and getting seriously confused about every aspect of what is in reality the simplest interface in the whole framework.
And the extremely important value of IDisposable and the using keyword are being obscured by this.
The strangest statement on this page is the very first one: "The primary use of this interface is to release unmanaged resources."
And then the finalizer example makes it perfectly clear that Dispose can release both managed and unmanaged resources! It's the finalizer that is only allowed to release unmanaged resources (a rule that is actually an oversimplification, due to the complexity of finalization). And indeed, Dispose is extremely valuable as a way to clean up state implemented in managed code, with nothing to do with unmanaged code.
Indeed, the distinction between managed/unmanaged is irrelevant to a pure discussion of IDisposable (ignoring the niche topic of finalizers). It is not necessarily possible to tell from an API whether it is implemented in IL or C/C++/COM.
The only way to make sense of that wording is to take the phrase "unmanaged resource" as describing any resource (or program state) apart from managed memory itself. That is, anything you need to clean up where the GC is not an effective solution.
But then that would be a different meaning of "unmanaged" than is used elsewhere...