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

最初のキャストは次のとおりです。

  • に変換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
于 2012-08-02T12:48:39.010 に答える