The Liskov Substitution Principle Demystified

I think I understand. We still have the difference between the precondition violation (constructor rejects value < 0) which you wrote and the invariant violation (value field never < 0), which you never wrote.

You couldn't weaken the precondition without weakening the invariant (this wouldn't achieve anything), and changing the *invariant* creates an incompatible contract.

I *think* I have that right. :)