我很难理解这一点。考虑以下示例:
protected void Page_Load(object sender, EventArgs e)
{
// No surprise that this works
Int16 firstTest = Convert.ToInt16(0);
int firstTest2 = (int)firstTest;
// This also works
object secondTest = 0;
int secondTest2 = (int)secondTest;
// But this fails!
object thirdTest = Convert.ToInt16(0);
int thirdtest2 = (int)thirdTest; // It blows up on this line.
}
我在运行时遇到的具体错误是Specified cast is not valid.
如果我快速观看(int)thirdTest
在 Visual Studio 中,我得到的值为Cannot unbox 'thirdTest' as a 'int'
.
这到底是怎么回事?
拆箱检查确切的类型,如中所述文档 http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx.
拆箱是从类型对象到值的显式转换
类型或从接口类型到实现该值的值类型
界面。拆箱操作包括:
检查对象实例以确保它是装箱值
给定的值类型。
将实例中的值复制到值类型变量中。
正如您所看到的,第一步是检查对象实例是否与目标类型匹配。
还引用文档中的内容:
为了在运行时成功拆箱值类型,该项目是
unboxed 必须是对先前创建的对象的引用
通过装箱该值类型的实例。尝试取消装箱 null
导致 NullReferenceException。尝试取消对某个引用的装箱
不兼容的值类型会导致 InvalidCastException。
因此,要修复此错误,请在尝试拆箱之前确保类型匹配:
object thirdTest = Convert.ToInt16(0);
short thirdtest2 = (short)thirdTest;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)