I only programmed .NET in the days of 2.0, so my problems with it come from an older less capable framework. Nonetheless, when your language of choice requires you to distinguish between: - IComparable - IComparable(Of T) - IEquatable(Of T) - IStructuralEquatable - IStructuralComparable - IEqualityComparer - IEqualityComparer(Of T) - IComparer(Of T) - overriding Object.Equals - overriding operators , =, =, ...it's ti…
Saying that you need to understand and differentiate between all of these is disingenuous. - The "Structural*" types are new in .Net 4.0, you never had to understand them before and you probably don't need to even know they exist now. - Many of these listed are just generic vs non-generic. The generic ones subclass the non-generic ones, so contraviance eliminates the need to really understand the distinction upfront.…
You're right, I scooped those off MSDN and never use them myself. All the others, however, have made numerous appearances in my code. I think that the preponderance of comparisons is a language smell-- it's not close to my only problem with .NET development but I think it captures the essential headache-inducing inelegance of C#/VB programming. That language-blob has little regularity but much accretion. There are rarely sane defaults nor any overarching design for your mind to latch onto. After time spent with saner languages (Python, Haskell, Ruby, OCaml, etc...) coding in .NET feels terrible.