Vb.net - Почему для ULong (UInt64) не разрешен оператор + =?

Почему я могу назначить ULong буквальное значение при создании

Dim myULong As ULong = 0

но с опцией strict on, я не могу увеличивать, как показано ниже?

myULong += 1

Visual Studio 2013 говорит мне

Option Strict On disallows implicit conversions from 'Decimal' to 'ULong'.

Я не знаю, как VS делает десятичную цифру в этой строке кода...

Спасибо за ваш вклад!

Ответ 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