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  
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top