Agreed that Microsoft is adding features for the sake of setting C# apart rather than making it a better language (IMO).
I strongly disagree about the treatment of null values, if there's one thing I like about C# it's that (even if it's crude, it's better than Scala's way of doing it which is Maybe or Option or something, sorry, it's been a while.) Also C# doesn't 'force' you, you have to require it before it enforces no-nulls.
> It obscures the difference between value and reference types
How, and how is that a problem?
> Plus the syntax implies Nullable<T>, which is something everyone should have learned to avoid when all it did was box value types.
Err, now I'm getting really rusty. What are you saying here?
> The more correct solution would have been to finish the contract system that allowed you to declare a function argument as non-nullable.
That's effectively what the no-null enforcement does, only it applies inside a function as well (if you make it do so anyway).
I completely disagree that it "wasn't a problem to begin with" .Hoare called it his billion-dollar mistake, and that's an underestimate. And we haven't muddied the syntax because you enable no-nulls with a pragma, and the null situation is definitely not the same as it has always been. The compiler picks them up and reports them (like I said, rather crappily but it's a damn sight better than nothing).