These are the docs about
Because Object is the base class of all reference types in the .NET
Framework, this behavior [.ToString()] is inherited by reference types that do not
override the ToString method.
For example, the base types such as Char, Int32, and String provide ToString implementations
Int32 is a struct and therefore a value type. But:
System.Object System.ValueType System.Int32
Int32 derives from System.ValueType and this itself derives from System.Object. Et voilà...