J'ajouterais à la réponse de Kilian qu'une grande différence entre Java et C # est que les concepteurs C # contrôlent non seulement le langage, mais aussi l'IDE standard.
L'ajout de quelque chose comme des méthodes d'extension et des classes partielles pourrait être un cauchemar dans le développement / contrôle des versions si les IDE ne le supportaient pas correctement.
Comme vous êtes censé être capable de compiler Java avec la plate-forme de votre choix (Eclipse, Netbeans, vi + Ant), ajouter des fonctionnalités qui cassent le code (et les utiliser pour développer des extensions supplémentaires comme LINQ) est beaucoup plus compliqué que de simplement dire " comme IntelliSense traitera ces cas, nous ne devons pas nous inquiéter ".
De plus, il convient parfois de noter la valeur des fonctionnalités au lieu de leur nombre. Par exemple, les propriétés automatiques sont agréables et je souhaite certainement que Java le prenne en charge, mais au final cela signifie seulement que vous devez écrire quelques lignes de code supplémentaires en Java. De même, je trouve qu'appeler "Events" une fonctionnalité est un peu impropre, car ils ne sont guère plus que des délégués spécialement étiquetés, et juste une copie raffinée du modèle Observer déjà utilisé par Java (là encore, en Java, il a besoin de plus explicite codage)
Ne vous méprenez pas, je pense que C # a introduit plusieurs innovations notables, et je souhaite qu'un jour les grands patrons Oracle se réveillent et lancent un vrai "Java 2" pour inclure certains d'entre eux, mais l'écart n'est pas aussi évident que votre points d'interrogation.