Tôi sẽ thêm vào câu trả lời của Kilian rằng một điểm khác biệt lớn giữa Java và C # là các nhà thiết kế C # không chỉ kiểm soát ngôn ngữ mà còn cả IDE tiêu chuẩn.
Thêm một cái gì đó như phương thức mở rộng và các lớp một phần có thể là một cơn ác mộng trong phiên bản phát triển / kiểm soát nếu các IDE không hỗ trợ đúng cách.
Vì bạn dự kiến có thể biên dịch Java với nền tảng lựa chọn của bạn (Eclipse, Netbeans, vi + Ant), việc thêm các tính năng phá mã (và sử dụng các tính năng này để phát triển các tiện ích mở rộng bổ sung như LINQ) phức tạp hơn nhiều so với chỉ nói " vì IntelliSense sẽ giải quyết các trường hợp này, chúng tôi không cần phải lo lắng ".
Ngoài ra, đôi khi đáng chú ý giá trị của các tính năng thay vì số lượng của nó. Ví dụ, các thuộc tính tự động là tốt và tôi chắc chắn muốn Java hỗ trợ điều này, nhưng cuối cùng, điều đó chỉ có nghĩa là bạn phải viết thêm một vài dòng mã trong Java. Tương tự, tôi thấy rằng việc gọi "Sự kiện" là một tính năng có phần sai, vì chúng ít hơn các đại biểu được gắn nhãn đặc biệt và chỉ là một bản sao tinh chỉnh của mẫu Observer đã được Java sử dụng (sau đó, trong Java, nó cần rõ ràng hơn mã hóa)
Đừng hiểu sai ý tôi, tôi nghĩ rằng C # đã giới thiệu một số cải tiến đáng chú ý và tôi ước rằng một ngày nào đó, các ông chủ lớn của Oracle sẽ thức dậy và tung ra một "Java 2" thực sự để bao gồm một số trong số đó, nhưng khoảng cách không rõ ràng như của bạn điểm câu hỏi.