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
有人可以解释为什么会这样吗?
答案 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