Contract.Ensures for OverFlowException

时间:2013-04-21 04:51:14

标签: class pex contract overflowexception

我有一个简单的方法,它返回给定数字的指数值:

    public int Exp(int num)
    {
        return Convert.ToInt32(System.Math.Exp(num));
    }

运行Pex时,我在Summary / Exception字段中获取某个大数字的OverFlowException:1969057606。

如何使用Contract.Ensure()创建帖子条件? 我尝试了以下但它没有做任何事情:

Contract.Ensures(Contract.Result<int>() < 2147483647);

// This is because the max value an int variable can hold is 2147483647

1 个答案:

答案 0 :(得分:0)

Contract.Ensures用于在函数运行后断言类的状态,或者在这种情况下,函数的结果,无论输入是什么。您需要添加一个Contract.Requires,以便 e ^ num&lt; = int.MaxValue,例如

Contract.Requires<ArgumentOutOfRangeException>(num <= Math.Floor(Math.Log(int.MaxValue)))

虽然您可能希望将最大值计算拉出为常数。

public static readonly int MAX_EXPONENT = Math.Floor(Math.Log(int.MaxValue));
...
Contract.Requires<ArgumentOutOfRangeException>(num <= MAX_EXPONENT)