Does adding optional parameters change method signatures and would it trigger method missing exception?

We have several projects that are referencing library assembly lets call "myUtil", now one of the method which is referenced in several projects is,

GetData(int p1, string p2, object p3, bool p4 = false);

Now if I change above method to this,

GetData(int p1, string p2, object p3, bool p4 = false, bool p5 = false);

Do I must need to update "myUtil.dll" assembly to projects referencing it ?

WIthout referencing it I get this error which does makes sense and goes away when I update reference, but I am NOT ABLE TO VALID FIND reference where it says you must need to update references

System.MissingMethodException: Method not found: 'Void GetData(....

Jon Skeet
people
quotationmark

You don't need to remove and re-add the reference, but you do need to rebuild all of the projects that compile against the DLL. Adding an optional parameter is a source-compatible but not a binary-compatible change, because the compiler emits different IL at the call site, to include the default value as normal - the call itself looks the same in the IL whether the optional parameter was omitted or not.

For example, consider the following code:

class Test
{
    static void Main()
    {
        Foo(3);
        Foo();
    }

    static void Foo(int x = 5)
    {
    }
}

The IL for Main looks like this:

  .method private hidebysig static void  Main() cil managed
  {
    .entrypoint
    // Code size       16 (0x10)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldc.i4.3
    IL_0002:  call       void Test::Foo(int32)
    IL_0007:  nop
    IL_0008:  ldc.i4.5
    IL_0009:  call       void Test::Foo(int32)
    IL_000e:  nop
    IL_000f:  ret
  } // end of method Test::Main

As you can see, the constant 5 is loaded in the Main method and passed as an argument, just as 3 is explicitly. The same thing happens across assembly boundaries.

The same rules also applies to changing the values of constants, and changing the default value of an optional parameter - all of these require client rebuilds.

people

See more on this question at Stackoverflow