Как я могу указать, что метод никогда не возвращает ноль, используя контракты кода? - PullRequest
1 голос
/ 25 февраля 2009

Как мне указать, что метод никогда не возвращает нуль? В настоящее время это мой код.

Строка 19 получает сообщение Ensures not Verified, хотя CreateFunction предполагает, что результат не является ничем.

1         <Pure()> Public Function CreateFunction(Of TArg1, TArg2, TResult)(ByVal body As Func(Of Expression, Expression, BinaryExpression)) As Func(Of TArg1, TArg2, TResult)   
2             Contract.RequiresAlways(body IsNot Nothing)   
3             Contract.Assume(Contract.Result(Of Func(Of TArg1, TArg2, TResult))() IsNot Nothing)   
4   
5             Dim arg1 = Expression.Parameter(GetType(Integer), "arg1")   
6             Dim arg2 = Expression.Parameter(GetType(Integer), "arg2")   
7   
8   
9             Dim temp = Expression.Lambda(body(arg1, arg2), arg1, arg2)   
10             Contract.Assume(temp IsNot Nothing)   
11             Return DirectCast(temp.Compile, Global.System.Func(Of TArg1, TArg2, TResult))   
12         End Function  
13   
14         <Pure()> Public Function Add() As Func(Of T, T, T)   
15             Contract.Ensures(Contract.Result(Of Func(Of T, T, T))() IsNot Nothing)   
16   
17             Dim temp = CreateFunction(Of T, T, T)(AddressOf Expression.AddChecked)   
18             Return temp   
19         End Function  

Ответы [ 2 ]

6 голосов
/ 25 февраля 2009

делает

Contract.Ensures(Contract.Result() != null);

работа? По сути, я бы попробовал разобрать его до тех пор, пока вы не найдете самый простой случай, который не сработает, как вы ожидаете, и перейдете оттуда.

- MarkusQ

0 голосов
/ 27 апреля 2013

Вам нужно изменить Assume в CreateFunction на Ensures. После этого вы должны быть в порядке. Помните, Assume для внутренних предположений, чтобы помочь статической проверке локально. Они не видны из других методов. Только Requires и Ensures являются кросс-методическими контрактами.

...