Почему я не могу вытащить ушорт из системы?Объект, а затем бросить его как 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 3

2 ответа:

Вы пытаетесь распаковать ушорт, и он может быть распакован только в ушорт.

Как только вы распакуете его, вы можете привести его в нормальное состояние.

Любое упакованное значение типа T может быть распаковано только до T (или Nullable).

Эрик Липперт сделал очень хороший пост в блоге об этой самой вещиздесь .

Проблема с оператором литья состоит в том, что он действительно означает две вещи: литье и преобразование. Можно преобразовать значение из числа в другое число, но нельзя привести прямоугольное число к неправильному типу числа. Таким образом, вместо этого вам придется сделать следующее:

uint spmajor = (uint)(ushort)queryObj["ServicePackMajorVersion"];

Еще лучше:

uint spmajor = Convert.ToUInt32(queryObj["ServicePackMajorVersion"]);