情况 1 产生类型不匹配异常。案例 2 按预期工作。有谁知道为什么?还是将作为对象的 Int32 转换为 Int16 的更好方法?
案例一:
var i = (Int16)(object)Int32.Parse("1");
案例二:
var i = (Int16)Int32.Parse("1");
最佳答案
根本原因是在 C# 中显式转换运算符有两种不同的含义:
- representation-preserving 的意思是:“我知道这个对象总是类型 T,即使编译器无法静态地证明它 - 请让我将它用作 T 而不是更多的东西一般的”。
- representation-changing 的意思是:“我知道这个对象不是类型的 T,但是有一个转换可以把它变成 T,我会喜欢要执行的转换”。
所以你得到两种不同行为的原因是你分别使用了上述每个不同的含义:
- 你的第一个片段说:“我知道这个
对象
绝对是一个盒装的Int16
,我想这样使用它”。但由于它实际上是一个装箱的Int32
,您会得到一个类型不匹配异常。 - 您的第二个片段说:“我知道这个
Int32
绝对不是Int16
,但我想将它转换为一个”。
换句话说,仅当您尝试拆箱为原始类型时,拆箱才有效。 According to Eric Lippert ,原因在于以一种可以在单个操作中拆箱和转换的方式实现它实在是太不切实际了。
关于c# - 为什么强制转换操作在情况 1 中失败但在情况 2 中成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37325650/