首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(T)retObject[parameter]无法将“retObject[parameter]”拆箱为“T”

(T)retObject[parameter]无法将“retObject[parameter]”拆箱为“T”
EN

Stack Overflow用户
提问于 2012-11-06 05:56:51
回答 1查看 199关注 0票数 2

没什么好说的,这就是问题:

代码语言:javascript
复制
    public static T WriteIfNotNull<T>(ManagementObject retObject, string parameter)
    {
        return retObject[parameter] != null ? (T)retObject[parameter] : default(T);
    }

T是一个intretObject[parameter]是一个对象时,它就会中断。奇怪的部分(至少对我来说)是,如果T不是T,而实际上是一个指定的int,那么它就可以工作。

它说它不能被强制转换为T (即使在本例中,Tint)。

@Edit:@dtb是这样的:

代码语言:javascript
复制
Specified cast is not valid. 
(T)(object)retObject[parameter] Cannot unbox 'retObject[parameter]' as a 'T'    int         

和值:

参数:"ProcessId"

retObjectparameter:4

默认(T):0

@@Edit:这里也有一个调用

代码语言:javascript
复制
pr.ProcessId = Util.WriteIfNotNull<int>(retObject, "ProcessId");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-06 05:59:41

在我看来,retObject[parameter]实际上不是int,而是另一种数值类型(uint通常表示进程‘d),在这种情况下,您可能希望使用Convert来实际更改该值:

代码语言:javascript
复制
return retObject[parameter] != null 
    ? (T)Convert.ChangeType(retObject[parameter], typeof(T)) 
    : default(T);

简单的强制转换在这里不起作用的原因是,从objectint的强制转换只有在它实际上是盒装的int时才有效。您不能在一个操作中进行向下转换和转换转换,因为不存在从objectint的转换转换。因此,远离object的强制转换要求您强制转换为确切的类型或有效的超类型、接口等。

因此,要将已装箱的uint转换为int,我们必须首先取消装箱为int (有问题),或者使用Convert方法之一来更改类型(如上所示)。

Convert.ChangeType()用于在兼容类型之间进行转换,即使它们是装箱的。例如,如果retObject[parameter]返回long,则允许将其转换为intT

我有一篇关于这个here的博客文章,有更多的细节,希望这是有意义的。同样,要点是从object转换是一个向下转换(没有为object定义转换转换),因此您必须将它转换为它的精确类型(或有效的子类型)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13241061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档