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 및 두 번째 복싱에 대한 호출을 제거하고 int를 남긴 다음 스택에서 int를 삭제하면 정상적으로 실행됩니다. 어떤 이상한 이유, 권투, unboxing, 다음 reboxing 오류가 발생합니다.

그래서 두 번째 복싱에서는 첫 번째 복싱과 달리 실행되는 동안 오류가 발생합니다.

+2

'unbox'는 관리되는 포인터를 값 자체가 아닌 평가 스택으로 푸시합니다. 대신에'unbox.any'를 사용해보십시오. – Lee

+0

네, 고쳐 주셨습니다. 당신은 당신의 코멘트에서 대답을해야합니다 :) –

답변

3

unbox은 관리되는 포인터를 값 자체가 아닌 평가 스택으로 푸시합니다. 대신 unbox.any을 사용해보세요. - Lee