Почему я не могу вытащить ушорт из системы?Объект, а затем бросить его как uint? (С#)
Я манипулирую элементами в списке, который является System.Management.ManagementObjectCollection
. Каждый из этих элементов является System.Management.ManagementObject
, который содержит свойства, индексированные строкой. Смотрите:
foreach (ManagementObject queryObj in searcher.Get())
{
string osversion = (string)queryObj["Version"];
string os = (string)queryObj["Name"];
uint spmajor = (uint)queryObj["ServicePackMajorVersion"];
uint spminor = (uint)queryObj["ServicePackMinorVersion"];
...
...
...
}
Каждый "доступ по словарю" к queryObj
возвращает C# object
, который на самом деле является тем, чем должно быть свойство-я должен знать их "реальный" тип заранее, и это нормально.
Проблема в том, что я получаю InvalidCastException
в uint
бросках. Я должен использовать реальный тип, который является ushort
. Разве приведение от ushort
к uint
не должно быть приемлемым и очевидно?
В этом случае я в конечном итоге преобразую значения в string
, но что, если мне нужно было бы преобразовать их в переменные uint
, int
или long
?
2 ответа:
Вы пытаетесь распаковать ушорт, и он может быть распакован только в ушорт.
Как только вы распакуете его, вы можете привести его в нормальное состояние.
Любое упакованное значение типа T может быть распаковано только до T (или Nullable).
Эрик Липперт сделал очень хороший пост в блоге об этой самой вещиздесь .
Проблема с оператором литья состоит в том, что он действительно означает две вещи: литье и преобразование. Можно преобразовать значение из числа в другое число, но нельзя привести прямоугольное число к неправильному типу числа. Таким образом, вместо этого вам придется сделать следующее:
uint spmajor = (uint)(ushort)queryObj["ServicePackMajorVersion"];
Еще лучше:
uint spmajor = Convert.ToUInt32(queryObj["ServicePackMajorVersion"]);