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回目のボクシングで何が違うのですか?
'unboxは、値自体ではなく、値へのマネージドポインタを評価スタックにプッシュします。代わりに 'unbox.any'を使ってみてください。 – Lee
うん、それはそれを修正した。あなたはあなたのコメントから答えを作る必要があります:) –