将uint转换为Int32

时间:2015-03-08 13:00:22

标签: c# casting

我正在尝试从MSNdis_CurrentPacketFilter检索数据,我的代码如下所示:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI",
                "SELECT NdisCurrentPacketFilter FROM MSNdis_CurrentPacketFilter");

foreach (ManagementObject queryObj in searcher.Get())
{
     uint obj = (uint)queryObj["NdisCurrentPacketFilter"];
     Int32 i32 = (Int32)obj;
}

正如您所看到的,我正在从NdisCurrentPacketFilter 两次投射收到的对象,这引出了一个问题:为什么 ??

如果我尝试将其直接投射到int,例如:

Int32 i32 = (Int32)queryObj["NdisCurrentPacketFilter"];

抛出InvalidCastException。那是为什么?

1 个答案:

答案 0 :(得分:10)

有三件事对你不起作用:

  • 根据this linkNdisCurrentPacketFilter的类型为uint

  • 使用索引器queryObj["NdisCurrentPacketFilter"] returnsobject,在这种情况下为boxed uintNdisCurrentPacketFilter的值}。

  • 将盒装值类型can only取消装箱到同一类型,即必须至少使用以下内容:

    • (int)(uint)queryObj["NdisCurrentPacketFilter"];(即您已经在做的单行版本)或

    • Convert.ToInt32,使用IConvertible执行演员表,首先将其拆箱至uint


您可以使用类似

的内容重现与问题相同的问题
object obj = (uint)12345;
uint unboxedToUint = (uint)obj; // this is fine as we're unboxing to the same type
int unboxedToInt = (int)obj; // this is not fine since the type of the boxed reference type doesn't match the type you're trying to unbox it into
int convertedToInt = Convert.ToInt32(obj); // this is fine