私は奇妙に走りました:
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?
両方の変換が有効です。
2番目のケースは次のとおりです。
int
するint?
int?
(ボックス化されたものになりますint
)int?
int?
するdecimal?
これらの変換はすべて有効です。
3番目のケースは次のとおりです。
int
するint?
int?
(ボックス化されたものになりますint
)decimal?
ここでの最後の変換は無効です。同じ値型またはそれに相当するnull許容型にのみボックスを解除できます。(実際、CLRはこれよりもいくらか寛容ですが、この場合は関係ありません。)
いずれの場合も、への変換int?
は実際には関係ありません。null許容型へのアンボックス化は、null参照がnull値へのアンボックス化されることを除いて、null許容型へのアンボックス化は非null許容型へのアンボックス化と似ているという点で多少無関係です。ここにnull値がない場合、最後の例は次のようになります。
object o = 1; // Boxing
decimal d = (decimal) o; // Unboxing, but to the wrong type