Eu acrescentaria à resposta de Kilian que uma grande diferença entre Java e C # é que os designers de C # controlam não apenas a linguagem, mas também o IDE padrão.
Adicionar algo como métodos de extensão e classes parciais pode ser um pesadelo no controle de versão de desenvolvimento / controle se os IDEs não o suportarem adequadamente.
Como é esperado que você consiga compilar Java com sua plataforma preferida (Eclipse, Netbeans, vi + Ant), adicionar recursos que quebram o código (e usá-los para desenvolver extensões adicionais como LINQ) é muito mais complicado do que apenas dizer " como o IntelliSense lidará com esses casos, não precisamos nos preocupar ".
Além disso, às vezes vale a pena notar o valor dos recursos em vez de seu número. Por exemplo, as propriedades automáticas são boas e eu certamente desejo que o Java suporte isso, mas no final isso significa apenas que você precisa escrever mais algumas linhas de código em Java. Da mesma forma, acho que chamar "Eventos" de um recurso é um pouco inadequado, uma vez que eles são pouco mais do que delegados especialmente rotulados e apenas uma cópia refinada do padrão Observer já usado por Java (novamente, em Java, ele precisa de mais explicações). codificação)
Não me interpretem mal, acho que o C # introduziu várias inovações dignas de nota e desejo que algum dia os grandes chefes da Oracle acorde e lance um verdadeiro "Java 2" para incluir alguns deles, mas a diferença não é tão óbvia quanto a sua. pontos de interrogação.