c# - Can Interlocked.CompareExchange throw NullReferenceException? -


from https://msdn.microsoft.com/en-us/library/bb297966(v=vs.110).aspx

[comvisibleattribute(false)] public static t compareexchange<t>(     ref t location1,     t value,     t comparand ) t : class 

and

nullreferenceexception    address of location1 null pointer. 

but when use null reference location1, don't errors:

class { } class program {     static void main(string[] args)     {         dest = null;         src = new a();         // if dest null, replace src.         interlocked.compareexchange(ref dest, src, null);     } } 

is ok this? there danger throw nullreferenceexception in later versions of .net?

as other answer says, it's ok have variable contain null -- it's reference variable being null, , can't happen in c#, or other managed languages matter.

that said, can make interlocked.compareexchange throw nullreferenceexception working directly il. there have tricky if want remain in realm of managed, verifiable code:

  .method private hidebysig static void  main(string[] args) cil managed   {     .entrypoint     .maxstack  3     .locals init ([0] int32& x)  // x initialized null     ldloc.0     ldc.i4.1     ldc.i4.2     call  int32 [mscorlib]system.threading.interlocked::compareexchange(       int32&, int32, int32)     pop     ret   } 

this code pass verification, throw nullreferenceexception @ runtime. stack trace not show interlocked.compareexchange, since jit compiler inlines single lock cmpxchg instruction.

as @sean correctly pointed out, should not justify documentation saying method may throw nullreferenceexception, because technique can used break function taking ref or out parameter. example, int32.tryparse not document can throw nre if "the address of result null", nor expect to. managed code implicitly expected well-behaved when comes references.


Comments

Popular posts from this blog

sequelize.js - Sequelize group by with association includes id -

android - Robolectric "INTERNET permission is required" -

java - Android raising EPERM (Operation not permitted) when attempting to send UDP packet after network connection -