Ответ 1
Если два операнда имеют разные типы данных, результат арифметического выражения будет более точного типа данных.
Так как UInt64.MaxValue
больше, чем Int32.MaxValue
, добавив значение UInt64
к значению Int32
, получим a Decimal
(см. Расширение и сужение Конверсии), а не Int32
, диапазон которых слишком мал по сравнению с UInt64
. Результат также может быть отрицательным, поэтому UInt64
тоже не является хорошей альтернативой. На самом деле нет никакого неявного преобразования из UInt64
в любой другой интегральный тип, даже Int64
(Long
), так как он меньше.
Вот почему вы получаете ошибку компилятора, если пытаетесь переназначить результат на UInt64
vaue.
Вам либо нужно сделать это:
myULong = CULng(myULong + 1)
или (лучше) используйте 1UL
в первую очередь:
myULong += 1UL
MSDN:
Небезопасные преобразования типа, вызывают ошибку компилятора с опцией Strict На. Например, если вы попытаетесь добавить переменную Integer в Double переменной и присвоить значение переменной Integer, ошибке компилятора результаты, потому что двойная переменная не может быть неявно преобразована в введите Integer.
Кстати, С# будет автоматически использовать правильный тип, поэтому он компилирует:
UInt64 myULong = 1;
myULong += 1; // here 1 is treated as UInt64
тогда как это не будет компилироваться
myULong += -1; // -1 is Int32