Agregaría a la respuesta de Kilian que una gran diferencia entre Java y C # es que los diseñadores de C # controlan no solo el lenguaje, sino también el IDE estándar.
Agregar algo como métodos de extensión y clases parciales podría ser una pesadilla en el control de versiones de desarrollo / control si los IDE no lo admitieran adecuadamente.
Como se espera que pueda compilar Java con su plataforma de elección (Eclipse, Netbeans, vi + Ant), agregar funciones que rompan el código (y usarlas para desarrollar extensiones adicionales como LINQ) es mucho más complicado que decir " Como IntelliSense se ocupará de estos casos, no debemos preocuparnos ".
Además, a veces vale la pena señalar el valor de las características en lugar de su número. Por ejemplo, las propiedades automáticas son agradables y ciertamente desearía que Java lo admitiera, pero al final solo significa que tiene que escribir algunas líneas más de código en Java. De manera similar, encuentro que llamar a "Eventos" una característica es algo inapropiado, ya que son poco más que delegados especialmente etiquetados, y solo una copia refinada del patrón de Observador ya utilizado por Java (por otra parte, en Java necesita más información explícita codificación)
No me malinterpreten, creo que C # ha introducido varias innovaciones notables, y deseo que algún día los grandes jefes de Oracle se despierten y lancen un verdadero "Java 2" para incluir algunos de estos, pero la brecha no es tan obvia como su puntos de pregunta