Таким образом, создается впечатление, что вы используете контракты для проверки правильности работы вашего метода _Look.Я считаю, что правильный способ сделать это - перенести предварительные и последующие проверки в метод _Look.Для того, чтобы быть с вашим первым утверждением, нет необходимости, если вы не доверяете стеку, который находится вне вашего контроля.В свете этого я бы сделал следующее:
public void doSomeThing(Stack stack)
{
Contract.Requires(stack != null);
stack.Push("$");
_Look(stack);
stack.Pop();
}
private void _Look(Stack stack)
{
Contract.Requires(stack != null);
Contract.Requires(stack.Count > 0);
//do something here
Contract.Assert(stack.Count > 0);
}
Контракты предназначены для предварительной и последующей проверки, а не утверждения в середине кода.