null
everywhere.const
nowhere.- APIs are inconsistent, e.g. mutating an array returns
void
but appending to aStringBuffer
returns the same mutableStringBuffer
. - Collection interfaces are incompatible with immutable data structures, e.g.
Add
inSystem.Collections.Generic.IList<_>
cannot return a result. - No structural typing so you write
System.Windows.Media.Effects.SamplingMode.Bilinear
instead of justBilinear
. - Mutable
IEnumerator
interface implemented by classes when it should be an immutablestruct
. - Equality and comparison are a mess: you've got
System.IComparable
andEquals
but then you've also got:System.IComparable<_> System.IEquatableSystem.Collections.IComparer System.Collections.IStructuralComparable System.Collections.IStructuralEquatable System.Collections.Generic.IComparer System.Collections.Generic.IEqualityComparer - Tuples should be structs but structs unnecessarily inhibit tail call elimination so one of the most common and fundamental data types will allocate unnecessarily and destroy scalable parallelism.
Sunday, 6 May 2012
What's wrong with C#?
Subscribe to:
Post Comments (Atom)
1 comment:
No pattern matching, crippled switch statement, no language-level inlining, no language-integrated tuples, no free functions, no records/discriminated unions, no units of measure, no object expressions, no first-class functions, no "everything is an expression", no useful type inference, no compositioning/pipelining, no automatic generalization, no code quotations, no custom operators, no generalized type extensions, ...
Post a Comment