Как вы, вероятно, знаете, DWORD — это хранится как 32-битное двоичное число. Что может быть не сразу очевидно, так это то, что он без знака — и, следовательно, UInt32
(uint
). В противном случае вы не сможете сохранить значение 4294967295
, так как максимальное значение целого числа со знаком (int
) равно 2 147 483 647.
Однако есть одна загвоздка! Как отметил @Jimi в комментариях, SetValue()
попытается выполнить Convert.ToInt32()
, что вызовет переполнение с любым значением выше Int32.MaxValue
— таким образом, вы получите сообщение об ошибке. Можно было бы ожидать, что он будет использовать Convert.ToUInt32()
, но, как также обнаружил @Jimi, это известная ошибка в методе, которую Microsoft не может исправить из-за проблем с обратной совместимостью.
Вместо этого метод SetValue()
преобразует Int32
(int
) со знаком в 32-битное двоичное число без знака, при этом значения 0…2147483647
остаются без изменений, а значения -2147483647…-1
сохраняются в диапазоне 2147483648…4294967295
.
Это двоичное преобразование немного запутано, если вы думаете об этом как о целом числе со знаком. Но, к счастью, вы можете использовать встроенный в C# unchecked()
ключевое слово, чтобы разрешить переполнение и эффективно обрабатывать uint
как подписанное int
в пределах этих диапазонов:
key.SetValue("Current", unchecked((int)4294967295), RegistryValueKind.DWord);
Это действительно удобно, потому что позволяет вам продолжать работать со стандартным диапазоном UInt32
(uint
) 0…4294967295
точно так же, как если бы вы, например, RegEdit, не задумываясь о том, как обрабатывается двоичное преобразование.
person
Jeremy Caney
schedule
14.03.2020
RegEdit.msc
или подобное приложение? Из любопытства, какое приложение вы используете для ручного редактирования реестра Windows? - person Jeremy Caney   schedule 14.03.2020RegistryKey.SetValue
сRegistryValueKind.DWord
метод пытаетсяConvert.ToInt32()
передать значение, которое вы передали. Вместо этого используйтеQWord
. Если вы не укажете тип и установитеuint.MaxValue
, будет сохранена строка. - person Jimi   schedule 14.03.2020Convert.ToUInt32()
внутри, посколькуDWORD
— это целое число без знака? Тем не менее, если бы это было так, я бы ожидал, что код OP будет работать правильно, посколькуlong
со значениемuint.MaxValue
, очевидно, может быть преобразован вuint
. - person Jeremy Caney   schedule 14.03.2020Convert.ToInt32()
,Int32
неlong
. - person Jimi   schedule 14.03.2020