为何直接将Int64转为JValue正常,存为object后转换抛InvalidCastException?
问题原因解析
两种转换的本质不一样
第一段代码里的转换,不是直接把
Int64强转成JValue,而是Newtonsoft.Json的JValue类型自带了隐式转换运算符:
编译的时候,编译器会自动调用JValue的隐式转换逻辑,把Int64值包装成JValue实例,相当于偷偷帮你执行了JValue output = JValue.FromObject(Int64Value),所以看起来像是直接强转成功了。第二段代码的情况完全不同:
把Int64值存到object变量时,值类型的Int64会被装箱,此时这个object变量里实际装的还是Int64类型的实例,根本不是JValue。当你尝试把这个object强制转成JValue时,CLR会检查实际类型,发现Int64和JValue完全不沾边,自然就抛出InvalidCastException了。
怎么解决这个问题
如果要从装箱的object得到JValue,有两种方式:
- 先拆箱回Int64,再利用隐式转换:
JValue output1 = (Int64)Int64ValueInObject;
- 直接用JValue的FromObject方法,不管输入是什么类型都能正确转换:
JValue output1 = JValue.FromObject(Int64ValueInObject);
内容的提问来源于stack exchange,提问作者Aqib Naveed
相关产品推荐
相关产品推荐

