0

我奇怪地跑着:

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

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

4

1 回答 1

2

第一个演员是:

  • 转换intint?
  • 转换int?decimal?

两种转换都是有效的。

第二种情况是:

  • 转换intint?
  • Box the int?(最终成为 boxed int
  • 将对象拆箱int?
  • 转换int?decimal?

所有这些转换都是有效的。

第三种情况是:

  • 转换intint?
  • Box the int?(最终成为 boxed int
  • 将对象拆箱decimal?

此处的最后一次转换无效 - 您只能将其拆箱为相同的值类型或其可为空的等效项。(实际上 CLR 比这更宽容一些,但这与这种情况无关。)

在每种情况下转换int?为实际上是无关紧要的。对可空类型的拆箱也有些无关紧要,因为对可空类型的拆箱就像对非可空类型的拆箱,只是空引用被拆箱为空值。鉴于此处没有空值,您的最​​后一个示例等效于:

object o = 1; // Boxing
decimal d = (decimal) o; // Unboxing, but to the wrong type
于 2012-08-02T12:48:39.010 回答