どのように私はこの方法は、コードの契約を使用してヌルを返すことはありませんことを示しているのですか?
-
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);
仕事?あなたはあなたが期待して、そこから行くだろうと動作しない最も単純なケースを見つけるまでは基本的に、私はそれをペアリングしてみてくださいと思います。
- MarkusQ
他のヒント
あなたはAssume
にCreateFunction
でEnsures
を変更する必要があります。その後、あなたは大丈夫でなければなりません。 Assume
がローカル静的チェッカーを支援するために、内部の仮定のためであることを覚えておいてください。彼らは他の方法からは見えません。 Requires
とEnsures
だけは、クロス方式の契約である。
所属していません StackOverflow