The code below throws an exception:

Unhandled Exception: System.ArgumentNullException: Value cannot be null.
   at System.Threading.Monitor.Exit(Object obj)
   at Test.foo()
   at Test.Main()

Is this correct behavior? I understand why it is happening, but from my
reading of the spec, this behavior is incorrect.

BTW, the commercial implementation behaves the same (although the
Monitor.Exit line is missing from the stack trace, so I guess it inlines
that).

Regards,
Jeroen

//////////////////// start /////////////////////

.assembly extern mscorlib {}
.assembly test {}

.class private auto ansi beforefieldinit Test
       extends [mscorlib]System.Object
{
  .method public hidebysig newslot virtual
          instance void  foo() cil managed synchronized
  {
    ldnull
    starg 0
    ret
  }

  .method private hidebysig static void  Main() cil managed
  {
    .entrypoint
    newobj     instance void Test::.ctor()
    callvirt   instance void Test::foo()
    ret
  }

  .method public hidebysig specialname rtspecialname
          instance void  .ctor() cil managed
  {
    ldarg.0
    call       instance void [mscorlib]System.Object::.ctor()
    ret
  }
}

//////////////////// end /////////////////////

Reply via email to