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