Dodałbym do odpowiedzi Kiliana, że jedną wielką różnicą między Javą a C # jest to, że projektanci C # kontrolują nie tylko język, ale także standardowe IDE.
Dodanie czegoś takiego jak metody rozszerzeń i klasy częściowe może być koszmarem w wersjach programistycznych / kontrolnych, jeśli środowiska IDE nie będą go odpowiednio obsługiwać.
Ponieważ oczekuje się, że będziesz w stanie skompilować Javę na wybranej platformie (Eclipse, Netbeans, vi + Ant), dodawanie funkcji, które łamią kod (i używanie ich do opracowywania dodatkowych rozszerzeń, takich jak LINQ) jest o wiele bardziej skomplikowane niż tylko powiedzenie „ ponieważ IntelliSense poradzi sobie z tymi przypadkami, nie musimy się martwić ”.
Ponadto czasami warto zauważyć wartość funkcji zamiast jej liczby. Na przykład właściwości automatyczne są ładne i na pewno chciałbym, aby Java to obsługiwała, ale w końcu oznacza to tylko, że musisz napisać jeszcze kilka wierszy kodu w Javie. Podobnie uważam, że nazywanie funkcji „Zdarzenia” jest nieco błędne, ponieważ są one czymś więcej niż specjalnie oznaczonymi delegatami, a jedynie udoskonaloną kopią wzorca Observer już używanego przez Javę (z drugiej strony w Javie potrzebuje bardziej wyraźnego kodowanie)
Nie zrozumcie mnie źle, myślę, że C # wprowadził kilka ważnych innowacji i życzę, aby kiedyś wielcy szefowie Oracle obudzili się i uruchomili prawdziwą „Javę 2”, aby uwzględnić niektóre z nich, ale różnica nie jest tak oczywista, jak twoja pytania