Я тестировал что-то с помощью LinqPad и был удивлен, что следующий код не выдал исключение:
ulong lSmallValue = 5;
ulong lBigValue = 10;
ulong lDifference = lSmallValue - lBigValue;
Console.WriteLine(lDifference);
Console.WriteLine((long)lDifference);
Это дает следующий результат:
18446744073709551611
-5
К счастью, я надеялся на такое поведение, но предполагал, что это приведет к выдаче OverflowException
.
Исключение OverflowException возникает во время выполнения при следующих условиях:
- Арифметическая операция дает результат, выходящий за пределы диапазона типа данных, возвращаемого операцией.
- Операция приведения или преобразования пытается выполнить сужающее преобразование, а значение исходного типа данных выходит за пределы диапазона целевого типа данных.
Почему операция lSmallValue - lBigValue
не относится к первой категории?
ulong
по-прежнему имеет достаточно битов для хранения значений вашей операции (хотя это интерпретируется иначе, чем вы ожидаете). - person Uwe Keim   schedule 24.09.2012