Vorrei aggiungere alla risposta di Kilian che una grande differenza tra Java e C # è che i progettisti C # controllano non solo la lingua, ma anche l'IDE standard.
Aggiungere qualcosa come i metodi di estensione e le classi parziali potrebbe essere un incubo nel controllo delle versioni di sviluppo / controllo se gli IDE non lo supportassero correttamente.
Poiché ci si aspetta che sia possibile compilare Java con la propria piattaforma di scelta (Eclipse, Netbeans, vi + Ant), l'aggiunta di funzionalità che infrangono il codice (e l'utilizzo di queste per sviluppare estensioni aggiuntive come LINQ) è molto più complicata di solo dicendo "dal momento che IntelliSense si occuperà di questi casi, non dobbiamo preoccuparci".
Inoltre, a volte vale la pena notare il valore delle funzionalità anziché il suo numero. Ad esempio, le proprietà automatiche sono carine e certamente desidero che Java sia supportato da questo, ma alla fine significa solo che devi scrivere qualche riga di codice in più in Java. Allo stesso modo, trovo che chiamare "eventi" una caratteristica sia un po 'approssimativo, dal momento che sono poco più di delegati appositamente etichettati, e solo una copia raffinata del modello di Observer già usato da Java (quindi ancora, in Java ha bisogno di più espliciti codifica)
Non fraintendetemi, penso che C # abbia introdotto diverse innovazioni degne di nota, e mi auguro che un giorno i grandi capi di Oracle si sveglino e lanciano un vero "Java 2" per includerne alcuni, ma il divario non è così ovvio come i tuoi punti di domanda.