1

如何指示方法从不返回 null?目前这是我的代码。

第 19 行得到一条 Ensures notroved 消息,即使 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  
4

2 回答 2

6

Contract.Ensures(Contract.Result() != null);

工作?基本上,我会尝试减少它,直到你找到最简单的情况,它不能像你期望的那样工作,然后从那里开始。

——马库斯

于 2009-02-25T19:54:46.213 回答
0

您需要将Assumein更改CreateFunctionEnsures. 在那之后你应该没事。请记住,Assume是为了在本地帮助静态检查器进行内部假设。它们在其他方法中是不可见的。只有RequiresEnsures是跨方法合约。

于 2013-04-26T22:01:05.510 回答