Я пользуюсь 3,5 библиотеками для контрактов кода Microsoft
public object RetrieveById(int Id)
{
//stuff happens...
Contract.Ensures(newObject != null, "object must not be null");
return newProject;
//No error message if I move the Contract.Ensures to here
//But it isn't asserting/throwing a contract exception here either
}
Я получаю сообщение компилятора: "Раздел Error 18 Contract в блоке попытки в методе 'Контроллер. RetrieveById (Система. Int32)'
ОБНОВЛЕНИЕ:
Я понял это с Вашей справкой:
Проверьте по контракту. Результат
Контракт. Удостоверяется (Контракт. Результат ()! = пустой указатель, "объект не должен быть несуществующим");
Возможно, мне что-то не хватает, но я только что просмотрел документацию по этому поводу:
http://msdn.microsoft.com/en-us/library/dd412865.aspx
там написано:
Вызов этого метода должен быть в начало метода или свойства, перед любым другим кодом.
Поэтому просто оставьте вызов Ensures в начале метода, и у вас не должно возникнуть никаких проблем.
Это довольно просто: класс Contract сигнализирует о нарушениях контракта, генерируя исключение. Помещение его в блок попытки приводит к поражению цели, вы можете поймать исключение.
Вот аналогичное решение:
http://social.msdn.microsoft.com/Forums/en/codecontracts/thread/43f467f1-14b7-4e56-8030-50f842b7ba68
Ваше последнее изменение показывает, что у вас есть код. над заявлением Contract.Ensures
. Contract.Ensures
должен стоять перед любым другим кодом в вашем методе, поэтому:
public object RetrieveById(int Id)
{
//first line of method:
Contract.Ensures(newObject != null, "object must not be null");
//stuff happens...
return newProject;
}