铸造对象到十进制c尖锐的奇怪行为

时间:2012-08-02 12:38:20

标签: c# casting behavior

我跑得很奇怪:

var k = (decimal?)(int?)1; //valid cast
var p = (decimal?)(int?)(object)(int?)1; //valid cast
var l = (decimal?)(object)(int?)1; //Specified cast is not valid

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

第一个演员是:

  • int转换为int?
  • int?转换为decimal?

两次转换均有效。

第二种情况是:

  • int转换为int?
  • int?(最终以盒装int
  • 括起来
  • 将对象展开到int?
  • int?转换为decimal?

所有这些转换都有效。

第三种情况是:

  • int转换为int?
  • int?(最终以盒装int
  • 括起来
  • 将对象展开到decimal?

此处的最后一次转换无效 - 您只能取消装入相同的值类型或其可为空的等效类型。 (实际上CLR比这更宽容,但在这种情况下这并不相关。)

在每种情况下转换为int?实际上都无关紧要。对可空类型的拆箱也有些不相关,因为拆箱到可空类型就像拆箱到非可空类型一样,除了将空引用解包为空值。鉴于此处没有空值,您的最​​终示例等同于:

object o = 1; // Boxing
decimal d = (decimal) o; // Unboxing, but to the wrong type