First, you left out the language C# is going up against: Java. Comparing C# to C++ is going to make C++ look bad because C++ is aimed at a different goal, namely programming where you can’t afford garbage-collection for whatever reason.
Second, I’d prefer Common Lisp, and I’d likely recast the problem in a way that doesn’t need object-orientation. If OO really is the most natural way to look at things, CLOS is both standard and very good.
So do I. C++ always seemed like a trick: Fool the C programmers with syntax while making them use a Simula/Pascal clone with much, much stronger type safety requirements than C enforces. Objective-C, on the other hand, was obviously designed by someone who liked C and later got impressed by Smalltalk. Much cleaner, much easier to learn, and much easier to understand at a fundamental level. Plus, of course, no name mangling.
Your version of cleanliness breaks code that both works and is perfectly readable. I’m more willing to go along with the existence of #f to prevent the punning on NIL, because code that punned that way was pretty grody to begin with, but modifying the behavior of car and cdr just reeks of schoolmarmish enforced hygiene.
On the plus side, I’m now aware of a reason they did that. Thanks.