3

我正在操作列表中的项目,即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,这实际上是该属性应该是什么——我必须事先知道它们的“真实”类型,这没关系。

问题是,我InvalidCastExceptionuint演员阵容中得到了一个。我必须使用真正的类型,即ushort. 演员表不应该ushortuint可以接受和明显的吗?

在这种情况下,我最终会将这些值转换为string,但是如果我必须将它们放入uintorintlong变量中怎么办?

4

2 回答 2

19

您正在尝试拆箱ushort,它只能拆箱为 ushort。

一旦你把它拆箱,你就可以像往常一样投射它。

任何 T 类型的装箱值只能拆箱为 T(或 Nullable)。

Eric Lippert 在这里写了一篇关于这件事的非常好的博客文章。

于 2009-07-03T21:49:09.683 回答
2

转换运算符的问题在于它实际上意味着两件事:转换和转换。您可以将值从数字转换为不同的数字,但不能将装箱的数字转换为错误的数字类型。因此,您必须做的是:

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

更好的是:

uint spmajor = Convert.ToUInt32(queryObj["ServicePackMajorVersion"]);
于 2009-07-03T21:52:05.760 回答