Как я могу указать, что метод никогда не возвращает нуль, используя контракты кода?
Как мне указать, что метод никогда не возвращает нуль? В настоящее время это мой код.
Строка 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 ответа
Решение
Есть ли
Contract.Ensures(Contract.Result() != null);
Работа? По сути, я бы попытался разобрать его до тех пор, пока вы не найдете самый простой случай, который не сработает, как вы ожидаете, и перейдете оттуда.
- MarkusQ
Вам нужно изменить Assume
в CreateFunction
для Ensures
, После этого вы должны быть в порядке. Помните, Assume
для внутренних предположений, чтобы помочь статической проверке локально. Они не видны из других методов. Только Requires
а также Ensures
являются кросс-метод контрактов.