Contracts FAQ  Why not use Debug.Assert instead of
Contract.Requires etc..?  Use of Debug.Assert is encouraged
within your code to specify invariants that your code should
satisfy at certain program points. However Debug.Assert is ill-
suited to specify method-boundary contracts for the following
reasons:  Precondition visibility: Preconditions specify the
conditions a caller should establish prior to calling a method.
Because of this, preconditions must be visible to the caller in
the sense that the caller should be able to determine if he/she
satisfies the preconditions. Thus, preconditions should not
refer to internal state that the caller cannot access.
Debug.Assert on the other hand can be used to specify internal
consistency. Use Contract.Requires for preconditions so humans
and tools can identify the condition as a method contract,
rather than an internal consistency check.  Postconditions:
Using Debug.Assert for postconditions is tedious and error-
prone. A normal postcondition should be checked on ever