I don't know; I haven't thought about this deeply (I'm sure Don has). My guess is there are trade-offs, in that if you make the type inference algorithm smarter, you risk
- having the algorithm take longer (e.g. programs that take forever to compile before finally failing)
- accidentally making the type-inferencer Turing-complete (don't want to go there)
- having error messages become less predictable
- having a more complex mechanism makes it harder for humans to understand/simulate/predict
Though the type inferencer is pretty powerful today, the three-line summary I gave in a previous message on this thread can often adequately explain its behavior in 95% of situations.
(And yes, as it stands, it feels like perhaps > 80% of the 'need to add an annotation' errors come from "o.M" where the type of "o" didn't already flow into this expression from the left; this is one of the few expressions in the language that cannot "float a new constraint" to be solved later, as there is no generic type constraint in .Net that means "forall types 'a where 'a has a method or property named M constrained by this signature".)