gpt4 book ai didi

c# - (T)retObject[参数] 无法将 'retObject[parameter]' 拆箱为 'T'

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:49 27 4
gpt4 key购买 nike

不多说了,这是问题:

    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(即使在这种情况下 Tint)。

@Edit:@dtb 在这里:

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

以及值(value)观:

参数:"ProcessId"

retObject[参数]: 4

默认(T):0

@@Edit:这也是调用

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

最佳答案

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

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

简单转换在这里不起作用的原因是因为从 object 转换至 int仅当它实际上是盒装时才有效 int .您不能在一个操作中执行向下转换和转换转换,因为没有来自 object 的转换转换。至 int .因此远离 object要求您强制转换为准确类型或准确类型的有效父类(super class)型、接口(interface)等。

所以,转换一个盒装uintint我们要么拆箱为 int首先(有问题)或使用 Convert 之一更改类型的方法(如上所示)。

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

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

关于c# - (T)retObject[参数] 无法将 'retObject[parameter]' 拆箱为 'T',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13241061/

27 4 0