Странно, что он ничего не выбрасывает - , если вы используете инструмент для перезаписи с соответствующими настройками.Я предполагаю, что вы работаете в режиме, который не проверяет постусловия.
В Contract.Ensures
сбивает с толку то, что вы пишете в начале метода, но выполняет в конце метода.Программа перезаписи делает все возможное, чтобы убедиться, что она выполняется надлежащим образом, и при необходимости получает возвращаемое значение.
Как и во многих других отношениях с Code Contracts, я думаю, что лучше всего запускать Reflector для результатов 1013* инструмента переписывания.Убедитесь, что вы правильно настроили параметры, а затем поработайте над тем, что сделал переписчик.
РЕДАКТИРОВАТЬ: я понимаю, что еще не выразил точку из Contact.Ensures
,Проще говоря, это означает, что ваш метод что-то сделал к концу - например, он может гарантировать, что он добавил что-то в список или (что более вероятно), что возвращаемое значение не является нулевым, или положительным, или что-то еще.Например, у вас может быть:
public int IncrementByRandomAmount(int input)
{
// We can't do anything if we're given int.MaxValue
Contract.Requires(input < int.MaxValue);
Contract.Ensures(Contract.Result<int>() > input);
// Do stuff here to compute output
return output;
}
В переписанном коде будет проверка в точке возврата , чтобы убедиться, что возвращаемое значение действительно равно больше, чем ввод.