2013-04-21 65 views
0

我有一個簡單的方法,從給定數量的返回指數值:Contract.Ensures一個OverflowException異常

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

當運行的Pex我得到的彙總/異常場一定大量的OverflowException異常: 1969057606.

如何使用Contract.Ensure()創建後期條件? 我嘗試以下,但它不會做任何事情:

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

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

您應該使用'int.MaxValue'而不是實際的數字,對於查看代碼的人來說,閱讀和解析要容易得多。 – 2013-04-21 18:46:35

+0

非常感謝Gabriele。那是真實的!我感謝您的幫助! – user2303644 2013-04-22 13:32:14

回答

0

Contract.Ensures用來斷言一些有關你的類的狀態運行該功能後,或者在這種情況下,函數的結果,無論的意見是什麼。您需要添加合同。需要這樣的e^num < = 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) 
+0

布賴恩,非常感謝您的幫助!你的解釋有助於我解決主要問題。再次感謝! – user2303644 2013-04-22 13:30:59