방법이 코드 계약을 사용하여 널을 반환하지 않음을 어떻게 표시합니까?
-
06-09-2019 - |
문제
메소드가 널을 반환하지 않는다는 것을 어떻게 표시합니까? 현재 이것은 내 코드입니다.
CreateEfunction이 결과가 아무것도 아니라고 가정하더라도 19 행은 입증되지 않은 메시지를 보장합니다.
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
an Ensures
. 그 후에는 괜찮을 것입니다. 기억하다, Assume
정적 검사기를 로컬로 돕기 위해 내부 가정입니다. 다른 방법에서는 보이지 않습니다. 뿐 Requires
그리고 Ensures
간과 계약입니다.
제휴하지 않습니다 StackOverflow