Меня немного смущает поведение типа ulong
. Насколько я понимаю, это 64-битное целое число, используемое для положительные числа (максимальное значение – 18 446 744 073 709 551 615). Я только начал использовать его, потому что мне нужны действительно большие положительные числа, но есть какое-то странное поведение, которое я не понимаю, вокруг потенциальных отрицательных чисел.
ulong big = 1000000; //Perfectly legal
ulong negative = -1; //"Constant value "-1" cannot be converted to a ulong" Makes sense
//Attempt to sneak around the -1 as a constant compile-time error
int negativeInt = -1;
ulong negativeUlongFail = negativeInt; //"Cannot implicitly convert 'int' to 'ulong'.
//An explicit conversion exists (are you missing a cast?)"
//So I add casting
ulong negativeUlong = (ulong)negativeInt; //But this yields 18446744073709551615
//Try and get a negative number indirectly
ulong number = 0;
number = number - 10; //now number is 18446744073709551615 but no underflow error
Что происходит? Почему некоторые ошибки потери значимости перехватываются, а другие нет и даже не вызывают исключений? Могу ли я их обнаружить?
Я сосредоточился на получении отрицательных чисел путем переполнения, но я видел аналогичные вещи, когда получал числа больше максимального значения и переполнялся.
Я не уверен, являются ли они технически ошибками или исключениями, поэтому, пожалуйста, извините меня, если я использовал неправильную терминологию
checked
иunchecked
. - person Hans Passant   schedule 24.07.2017