没什么好说的,这就是问题:
public static T WriteIfNotNull<T>(ManagementObject retObject, string parameter)
{
return retObject[parameter] != null ? (T)retObject[parameter] : default(T);
}当T是一个int而retObject[parameter]是一个对象时,它就会中断。奇怪的部分(至少对我来说)是,如果T不是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"
retObjectparameter:4
默认(T):0
@@Edit:这里也有一个调用
pr.ProcessId = Util.WriteIfNotNull<int>(retObject, "ProcessId");发布于 2012-11-06 05:59:41
在我看来,retObject[parameter]实际上不是int,而是另一种数值类型(uint通常表示进程‘d),在这种情况下,您可能希望使用Convert来实际更改该值:
return retObject[parameter] != null
? (T)Convert.ChangeType(retObject[parameter], typeof(T))
: default(T);简单的强制转换在这里不起作用的原因是,从object到int的强制转换只有在它实际上是盒装的int时才有效。您不能在一个操作中进行向下转换和转换转换,因为不存在从object到int的转换转换。因此,远离object的强制转换要求您强制转换为确切的类型或有效的超类型、接口等。
因此,要将已装箱的uint转换为int,我们必须首先取消装箱为int (有问题),或者使用Convert方法之一来更改类型(如上所示)。
Convert.ChangeType()用于在兼容类型之间进行转换,即使它们是装箱的。例如,如果retObject[parameter]返回long,则允许将其转换为int的T。
我有一篇关于这个here的博客文章,有更多的细节,希望这是有意义的。同样,要点是从object转换是一个向下转换(没有为object定义转换转换),因此您必须将它转换为它的精确类型(或有效的子类型)。
https://stackoverflow.com/questions/13241061
复制相似问题