I'm sure I wrote a reply to this, but its not here, so I'll try again..
generally both for overriding and shadowing it is the "box" that determines what method implementation that is called.
If this is the case, then the .NET inheritance rules differ from Java significantly, which could be the source of my confusion. In java:
When a child member overrides a parent member, the implementation that is called is the child, regardless of boxing
When a child member shadows a parent member, the boxing is used to determine which implementation to call
If (as you state) the boxing determines what impl to call, then why does the following label display "abc 123", rather than "System.Object"
Label1.Tag = "abc {0}"
Label1.Text = String.Format(
Label1.Tag.ToString(), 123)
The Tag is an object, hence our string is boxed as an Object, but the impl of ToString() that is called is String.ToString() which returns the string. If the boxing of object were enforcing the use of Object.ToString() rather than the overridden String.ToString(), why does it not say "System.Object" in the label text (which is what Object.ToString would return)
TIA!