2016-10-23 9 views
1

私は適切にコンパイルに期待するものを、CIL/MSILボクシングの問題?

// the start of my Program::Main() 
.maxstack 8 // Yes I know it's a large stack size for 
      // the given method; it's just a test program ;) 
.entrypoint 
ldc.i4 10 
box  int32 
unbox int32 // Removing these two lines 
box  int32 // makes it run properly 
call void [mscorlib]System.Console::WriteLine(object) 
ret 

が代わりに言って、エラースローので、私はどのようにボクシングとアンボクシング作品を知っていたが、どうやら私がいないと思った「Invalid IL code in Program:Main(): box 0x1b000004を。」

私の理解から、操作は次のように行ってきました:

// instruction:  stack after instruction is run: 
    ldc.i4 10  // 10 
    box int32  // object(int32,10) 
    unbox int32  // 10 
    box int32  // should be object(int32,10), but instead, got an error. 

私はアンボクシングと再ボクシングを取り除く試みたが、それがうまく動作します。また、WriteLineと2番目のボクシングへの呼び出しを削除するだけで、intを残して、スタックからintを破棄しても問題ありません。いくつかの奇妙な理由、ボクシング、unboxing、reboxingはエラーをスローします。

だから、最初のボクシングのように実行するのではなく、2回目のボクシングで何が違うのですか?

+2

'unboxは、値自体ではなく、値へのマネージドポインタを評価スタックにプッシュします。代わりに 'unbox.any'を使ってみてください。 – Lee

+0

うん、それはそれを修正した。あなたはあなたのコメントから答えを作る必要があります:) –

答えて

3

unboxは、値自体ではなく、評価されたスタックに値への管理ポインタをプッシュします。代わりにunbox.anyを使用してみてください。 - Lee

関連する問題