Come faccio a indicare che un metodo non restituisce un valore nullo l'utilizzo di contratti di codice?
-
06-09-2019 - |
Domanda
Come faccio a indicare che un metodo non restituisce un valore nullo? Attualmente questo è il mio codice.
La linea 19 riceve un messaggio garantisce non provata, anche se CreateFunction presuppone che il risultato non è niente.
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
Soluzione
non
Contract.Ensures(Contract.Result() != null);
lavorare? In sostanza, mi piacerebbe provare paring giù fino a trovare il caso più semplice che non funziona come ci si aspetta e passare da lì.
- MarkusQ
Altri suggerimenti
È necessario modificare il Assume
in CreateFunction
a un Ensures
. Dopo di che si dovrebbe essere a posto. Ricordate, Assume
è per assunzioni interne al fine di aiutare il controllo statico a livello locale. Essi non sono visibili da altri metodi. Solo Requires
e Ensures
sono contratti cross-metodo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow