2

话不多说,这就是问题所在:

    public static T WriteIfNotNull<T>(ManagementObject retObject, string parameter)
    {
        return retObject[parameter] != null ? (T)retObject[parameter] : default(T);
    }

T当是一个int并且retObject[parameter]是一个对象时,它会中断。奇怪的部分(至少对我来说)是 ifT不是T并且实际上是一个指定的 int 它确实有效。

它说它不能被转换为T(即使在这种情况下T也是int)。

@Edit:@dtb 在这里:

Specified cast is not valid. 
(T)(object)retObject[parameter] Cannot unbox 'retObject[parameter]' as a 'T'    int         

和价值观:

范围:"ProcessId"

retObject [参数]:4

默认(T):0

@@Edit:这也是电话

pr.ProcessId = Util.WriteIfNotNull<int>(retObject, "ProcessId");
4

1 回答 1

2

在我看来,发生的事情retObject[parameter]实际上不是一个数字类型,int而是另一种数字类型(uint通常用于进程 ID),在这种情况下,您希望使用它Convert来实际更改值:

return retObject[parameter] != null 
    ? (T)Convert.ChangeType(retObject[parameter], typeof(T)) 
    : default(T);

一个简单的转换在这里不起作用的原因是因为转换 from objecttoint只有在它实际上是一个 boxed 时才起作用int。您不能在一次操作中进行向下转换和转换转换,因为没有从objectto转换int。因此,转换 fromobject需要您转换为确切类型或确切类型的有效超类型、接口等。

因此,要将 boxed 转换uint为 anint我们必须将 unbox 作为int第一个(有问题的)或使用其中一种Convert方法来更改类型(如上所示)。

Convert.ChangeType()即使它们被装箱,也适用于兼容类型之间的转换。例如,如果retObject[parameter]返回 along那么这将允许它转换为 a Tof int

我在这里有一篇关于此的博客文章,其中包含更多详细信息,希望这是有道理的。要点再次是,转换 fromobject是向下转换(没有为 定义转换转换object),因此您必须将其转换为它的精确类型(或有效的子类型)。

于 2012-11-05T21:59:41.417 回答