Aggiungerei alla risposta di Kilian che una grande differenza tra Java e C # è che i progettisti di C # controllano non solo il linguaggio, ma anche l'IDE standard.
Aggiungere qualcosa come metodi di estensione e classi parziali potrebbe essere un incubo nel controllo delle versioni di sviluppo / controllo se gli IDE non lo supportassero correttamente.
Dal momento che dovresti essere in grado di compilare Java con la tua piattaforma preferita (Eclipse, Netbeans, vi + Ant), aggiungere funzionalità che infrangono il codice (e usarle per sviluppare estensioni aggiuntive come LINQ) è molto più complicato del semplice dire " poiché 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 buone e certamente vorrei che Java lo supportasse, ma alla fine significa solo che devi scrivere qualche altra riga di codice in Java. Allo stesso modo, trovo che chiamare "Eventi" una caratteristica sia in qualche modo un termine improprio, dal momento che sono poco più che delegati appositamente etichettati, e solo una copia raffinata del modello Observer già utilizzato da Java (quindi, di nuovo, in Java ha bisogno di più esplicito codifica)
Non fraintendetemi, penso che C # abbia introdotto diverse innovazioni degne di nota e vorrei che un giorno i grandi capi Oracle si svegliassero e lanciassero un vero "Java 2" per includerne alcuni, ma il divario non è così ovvio come il vostro punti di domanda.