我奇怪地跑着:
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
有人可以解释为什么会这样吗?
第一个演员是:
int
为int?
int?
为decimal?
两种转换都是有效的。
第二种情况是:
int
为int?
int?
(最终成为 boxed int
)int?
int?
为decimal?
所有这些转换都是有效的。
第三种情况是:
int
为int?
int?
(最终成为 boxed int
)decimal?
此处的最后一次转换无效 - 您只能将其拆箱为相同的值类型或其可为空的等效项。(实际上 CLR 比这更宽容一些,但这与这种情况无关。)
在每种情况下转换int?
为实际上是无关紧要的。对可空类型的拆箱也有些无关紧要,因为对可空类型的拆箱就像对非可空类型的拆箱,只是空引用被拆箱为空值。鉴于此处没有空值,您的最后一个示例等效于:
object o = 1; // Boxing
decimal d = (decimal) o; // Unboxing, but to the wrong type