The question of whether C# or Java is ahead of the other is up for debate, but instead of focusing on language features of one or the other I would rather focus on what's involved with evolving a language. The is one fact that I don't think anyone will argue with: Java is older than C#.
Problems with changing how a language works:
- If you break backwards compatibility you piss off a lot of developers
- If you piss off your developers, they move on to another language that supports them better. Hence, no reason to keep working with the language.
- Java made some design decisions early on with a pressure to get the language to market. The hope was to go back and fill in some of the blanks. Those decisions still plague the language because the maintainers don't want to violate the first point.
- Java blazed a lot of new territory, and proved once and for all that a garbage collected language can be taken seriously--and perform well enough for most people.
- C# came in later and learned a lot of the lessons that Java stumbled into--so they were able to avoid some of the technical limitations that Java has because of point 3.
- New language features have to solve a real problem in a sensible way. Not every language feature makes sense in the context of the language you are trying to add it to. This is why, despite their similarities, Java and C# will continue to be different languages.
So, does C# have more language features than Java? I think so. Are they useful? I think so. Does that mean that C# is better or more mature than Java? That I disagree with. They are different, plain and simple. Java will never have all of C#'s features as C# will never have all of Java's features.
One of the features of Java, the ability to write a program on Windows and deploy it on Unix or Mac, will never happen directly by Microsoft's support. Why, you ask? It's not because Microsoft is evil (whether that is true or not I don't really care). It's because they learned a lesson that Sun never did: write once run anywhere commoditizes the operating systems and hardware. If you care about making money from the sales of your operating system, you don't want to make it trivial to swap out and still have an application work. If you did that, you can't make any profit from the operating system because there are always cheaper options.