in no particular order:
- function pointers (delegates); the whole passing interfaces around thing is stupid
- real generics; what's the point of having type safe generics if the compiler can't even hold the meta data through a unit's compilation?
- ui speed; all the self-drawing ui libraries are very slow compared to native controls wrapped in "managed" libraries, not to mention that microsoft's self-drawn ui is hardware accelerated through direct3d
- an
yield return
construct; c# is so user friendly in this it's crazy
- operator overloading
- linq; just cuz its so addicting
- properties; more synctatic sugar you get addicted to
- better interop with native code; c#'s p/invoke and native com support makes interop so easy compared to jni -.-
- first class value types; this goes hand in hand with real generics, having generic lists that never box/unbox in c# is part of why c# is faster than java.
and i'd say this is the most important one:
- a responsive, informative debugger; nothing can even come close to visual studio right now