Como faço para indicar que um método nunca retorna um valor nulo usando contratos de código?
-
06-09-2019 - |
Pergunta
Como faço para indicar que um método nunca retorna um valor nulo? Atualmente, esse é o meu código.
A linha 19 recebe uma mensagem Garante não comprovada, embora createFunction assume que o resultado não é nada.
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
Solução
O
Contract.Ensures(Contract.Result() != null);
trabalho? Basicamente, eu tentaria apara-lo para baixo até encontrar o caso mais simples que não funciona como seria de esperar e de lá ir.
- MarkusQ
Outras dicas
Você precisa mudar o Assume
em CreateFunction
a um Ensures
. Depois disso, você deve estar bem. Lembre-se, Assume
é para premissas internas, a fim de ajudar o verificador estático localmente. Eles não são visíveis a partir de outros métodos. Apenas Requires
e Ensures
são contratos-Método cruz.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow