Я бы добавил к ответу Килиана, что одно большое различие между Java и C # заключается в том, что разработчики C # контролируют не только язык, но и стандартную среду IDE.
Добавление чего-то вроде методов расширения и частичных классов может стать кошмаром при разработке версий управления / контроля, если IDE не будут должным образом поддерживать его.
Поскольку от вас ожидают, что вы сможете скомпилировать Java с выбранной вами платформой (Eclipse, Netbeans, vi + Ant), добавить функции, которые нарушают код (и использовать их для разработки дополнительных расширений, таких как LINQ), гораздо сложнее, чем просто сказать " Поскольку IntelliSense будет заниматься этими случаями, нам не о чем беспокоиться ».
Кроме того, иногда стоит отметить ценность функций, а не их количество. Например, автоматические свойства хороши, и я, конечно, хотел бы, чтобы Java поддерживал это, но, в конце концов, это означает, что вам нужно написать еще несколько строк кода на Java. Точно так же я нахожу, что называть «События» функцией не совсем правильно, так как они представляют собой не что иное, как специально помеченные делегаты, и являются просто уточненной копией шаблона Observer, уже используемого Java (опять же, в Java требуется более явный кодирование)
Не поймите меня неправильно, я думаю, что C # представил несколько примечательных нововведений, и я хочу, чтобы когда-нибудь большие боссы Oracle проснулись и запустили настоящую «Java 2», чтобы включить некоторые из них, но разрыв не так очевиден, как ваш вопросы