加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么在案例1中转换操作失败但在案例2中成功?

发布时间:2020-12-15 18:13:08 所属栏目:百科 来源:网络整理
导读:情况1产生类型不匹配异常.案例2按预期工作.有谁有洞察原因?或者从Int32作为对象转换为Int16的更好方法? 情况1: var i = (Int16)(object)Int32.Parse("1"); 案例2: var i = (Int16)Int32.Parse("1"); 解决方法 根本原因是在C#中,显式强制转换运算符有两个
情况1产生类型不匹配异常.案例2按预期工作.有谁有洞察原因?或者从Int32作为对象转换为Int16的更好方法?

情况1:

var i = (Int16)(object)Int32.Parse("1");

案例2:

var i = (Int16)Int32.Parse("1");

解决方法

根本原因是在C#中,显式强制转换运算符有两个不同的含义:

>表示保留的含义是:“我知道这个对象总是T型,即使编译器无法静态证明 – 请让我用它作为T而不是更通用的东西”.
>表示改变的含义是:“我知道这个对象不是T类型,但是有一个转换将它变成T并且我希望执行转换”.

因此,您获得两种不同行为的原因是您分别使用上述不同含义:

>你的第一个片段说:“我知道这个对象肯定是一个盒装的Int16,我想这样使用它”.但由于它实际上是一个盒装Int32,因此会出现类型不匹配异常.
>你的第二个片段说:“我知道这个Int32肯定不是Int16,但我想把它转换成一个”.

换句话说,只有当您尝试取消装箱到原始类型时,取消装箱才有效. According to Eric Lippert,原因是以一种可以在单个操作中拆箱和转换的方式实现它实在是太不切实际了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读