Это должно быть легко для людей, но как мне выполнить беззнаковое смещение влево в VB.NET при использовании Option Strict
?
Возможно, я делаю это неправильно, но, пытаясь реализовать свою собственную функцию IP2Long (у меня есть свои причины), я тестирую вещи, чтобы убедиться, что моя голова правильно обернута вокруг процесса преобразования.Я попробовал несколько тестов, и все, кажется, вызывают ошибки.
Dim a As Int32
a = CUint(172 << 24) 'Constant expression not representable in type 'UInteger'
a = DirectCast((172 << 24), UInt32) 'Value of type 'Integer' cannot be converted to 'UInteger'
a = Convert.ToUInt32(172 << 24) 'Compiles, but throws an OverflowException
Последний из них особенно смущает.172 << 24
- это всего лишь 2885 681 152, что значительно превышает ограничение, установленное типом данных UInt32.Я предполагаю, что .NET выполняет сдвиг влево в режиме со знаком, затем пытается преобразовать в неподписанное, и это вызывает какую-то ошибку.
По сути, мой вопрос сводится к следующему: почему неподписанныеВременами числовые данные должны действовать как подобные взломы .NET Framework?Неужели для Microsoft так сложно сделать типы данных без знака неотъемлемыми для фреймворка?