I think I know what you mean...
I've ran into some classes with a private/protected Dispose method, but that did implement IDisposable, like the TcpClient you mention.
In these cases you have two options, cast to IDisposable and call Dispose or, the often intended method, call an alternative method, usually Close, instead.
This is probably by design and not a bug.
Probably because it makes more sense to "close" a connection than to dispose it.
I see that as far as the TcpClient goes, Dispose is accessible in .NET 4.7.2, but not 4 and 4.5 (and probably any older versions).
Another method of properly disposing these objects is by wrapping them in a using block, which still works.
var client = new TcpClient();
client.Dispose();
client.Close();
using (var client2 = new TcpClient())
{
}