C# isn't bad, but some things that annoy me:
- having to call new on every damn struct or class instance. I want to do Vec2 pos; instead of Vec2 pos = new Vec2();
- Can't easily make unmanaged C interface dlls. You can make dlls easily, but they are managed, making them not compatible with the MANY languages that can call C dlls. There's ways, but they are annoying.
- Access to raw memory is annoying compared to C++. This is needed for things like low level network packet handling, etc. Not "hard", just more annoying.
- No way I'd try to do C# on embedded devices.
D is a nice middle ground. It's like the good parts of C# mixed with the good parts of C++, with extras like Compile Time Function Evaluation and better templates. Native compiled, inline assembler, optional garbage collection.