Why are methods in C# final by default versus virtual in Java? Why is the override
keyword required to override virtual methods? How did issues like
versioning affect the design of C# and the .NET Framework?
You can read all about it in Part
IV of Bill Venners interview series with Anders Hejlsberg.