如何指示方法永远不会返回null?目前这是我的代码。
第19行获得了Ensures未经证实的消息,即使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
答案 0 :(得分:6)
Contract.Ensures(Contract.Result() != null);
工作?基本上,我会尝试将它削减,直到你发现最简单的情况不会像你期望的那样工作并从那里开始。
- MarkusQ
答案 1 :(得分:0)
您需要将Assume
中的CreateFunction
更改为Ensures
。在那之后你应该没事。请记住,Assume
用于内部假设,以便在本地帮助静态检查程序。从其他方法看不到它们。只有Requires
和Ensures
是跨方法合同。