2013-04-21 6 views
0

У меня есть простой метод, который возвращает экспоненциальное значение из заданного числа:Contract.Ensures в течение OverflowException

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

При запуске PEX я получаю OverflowException в поле Описание/Exception для некоторого большого числа: 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', а не фактическое число, для кого-то, кто ищет код для чтения и анализа, намного проще. –

+0

Большое спасибо Gabriele. Это правда! Я ценю вашу помощь! – user2303644

ответ

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