I was wrong, reflecting on the .NET design choices
If I attempt to generalize it, I think most of C#'s differences in language design that have opposites in Java are superior.  Examples include:<p>+ not virtual by default (so base classes can be changed more easily without breaking/recompiling downstream clients that the base class writer doesn't know about; specifying something as "virtual" should be a deliberate conscious decision by the class author)<p>+ value types (for speed, because J Gosling's idea that "_everything_ is an object is 'simpler' for programmers" has a cost -- the boxing & unboxing, and inefficient cache-unfriendly pointer-chasing containers)<p>+ no checked exceptions (checked exceptions have benefits in theory but real-world practice shows that it forces programmers to copy-paste mindless boilerplate to satisfy the checked-constraint)<p>+ unsigned types (very handy for P/Invoke API boundaries because legacy Win32 has unsigned params everywhere; yes, yes, Gosling said that unsigned types are confusing and dangerous but nevertheless, they are still very useful)<p>+ many other examples<p>This doesn't mean that Anders Hejlsberg's C# language team was smarter than J Gosling's Java team.  They simply had 7 years to observe how Java programmers (mis)used the language and therefore, could correct some design mistakes.<p>Nevertheless, C# still made some dubious decisions such as renaming "finalizers" to "destructors".  Java had the better name and C# should have kept the original terminology.