Что произошло с этим, так или иначе? Я делаю простое умножение:
Int64 x = 11111111111;
Int64 y = 11111111111;
Int64 z = x * y;
И в конце умножения, z показывает значение:
- 5670418394979206991
Это ясно переполнилось, но никакое исключение не повышено. Я хотел бы, чтобы был повышен, но...
Обратите внимание, что это находится на Windows Phone 7, но я не думаю, что это имеет любое влияние на проблему. Или он?
Вы можете использовать проверяемый блок, как уже указывалось в других ответах:
checked
{
long x = 11111111111;
long y = 11111111111;
long z = checked(x * y);
// ...
}
Что приводит к исключению:
OverflowException: Арифметическая операция привела к переполнению.
Если вы выполняете только одну операцию, где вам нужна проверка, вы можете использовать checked expression вместо этого:
long x = 11111111111;
long y = 11111111111;
long z = checked(x * y);
Вы также можете установить опцию компилятора /checked, чтобы по умолчанию была проверка.
Чтобы установить эту опцию компилятора в среде разработки Visual Studio:
- Откройте диалоговое окно Property Pages проекта. Подробнее см. в разделе Установка свойств проекта Visual C#.
- Щелкните папку Configuration Properties.
- Щелкните страницу свойств Build.
- Измените свойство Check for Arithmetic Overflow/Underflow.
Если вы измените значение по умолчанию на checked, вы можете использовать непроверенные блоки или выражения, чтобы снова получить непроверенное поведение.
Компилятор предполагает, что вы хотите сделать это таким образом, и продолжите переполнение. Если переполнение необходимо рассматривать как исключение для операции, оберните операцию вокруг , отмеченного
, и это вызовет исключение во время выполнения.
checked
{
Int64 x = 11111111111;
Int64 y = 11111111111;
Int64 z = x * y;
}
System.OverflowException: исключение типа System.OverflowException было брошен.
Попробуйте:
checked
{
Int64 x = 11111111111;
Int64 y = 11111111111;
Int64 z = x * y;
}
checked
{
Int64 x = 11111111111;
Int64 y = 11111111111;
Int64 z = x * y;
}