Stumbled upon this article written by no other than Eric Lippert listing the top 10 design faults of C# language. Here is the summary, the source to the full article is at the bottom.
#10: The empty statement does nothing for me
Reflects on the fact that lone “;” is a legal statement
#9: Too much equality
There are too many ways check for equality: ==, Equals, ReferenceEquals, CompareTo(…).
From personal experience double.NaN == double.NaN is false but double.NaN.Equals(double.NaN) is true
#8: That operator is shifty
Weirdness around << and >> operators
#7: I’m a proud member of lambda lambda lambda
The way C# 2.0 implements anonymous delegates
#6: Bit twiddling entails parentheses
#5: Type first, ask questions later
C# borrows the “type first” pattern from C and many of its other successor languages – something I got used to and the “correct” way now seems illogical to me
#4: Flag me down
The fact that you can create invalid enum values and have to manually check for this in the code
#3: I rate plus-plus a minus-minus
++i, i++, i +=1 etc. how much confusion and the pain it caused.
#2 I want to destruct finalizers
Agree with the author that finilisers in C# are symptoms of a bug. Seen it way too many times myself.
#1 You can’t put a tiger in the goldfish tank, but you can try
“array covariance” and how this could lead to run-time exceptions.