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