Wie zeige ich, dass ein Verfahren nie eine Null unter Verwendung von Code Verträgen zurückgibt?
-
06-09-2019 - |
Frage
Wie kann ich zeigen, dass ein Verfahren nie einen Nullwert zurückgibt? Derzeit ist dies mein Code.
Zeile 19 erhält eine Sorgt nicht Meldung bewiesen, auch wenn Create geht davon aus, dass das Ergebnis nicht nichts.
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
Lösung
Does
Contract.Ensures(Contract.Result() != null);
arbeiten? Grundsätzlich würde ich versuchen, es Schnipsel nach unten, bis Sie den einfachstenen Fall finden, das nicht funktioniert, wie man erwarten würde und gehen von dort aus.
- MarkusQ
Andere Tipps
Sie müssen die Assume
in CreateFunction
zu einem Ensures
ändern. Danach sollten Sie in Ordnung sein. Denken Sie daran, Assume
ist für die internen Annahmen, um lokal die statischen checker zu helfen. Sie sind nicht sichtbar von anderen Methoden. Nur Requires
und Ensures
sind Quer Verfahren Verträge.