◆ どっちとも取れる引数で渡されたら デフォルト引数なしでマッチする方が優先される
◆ リフレクションでデフォルト引数のところに Type.Missing 渡すことで呼び出せる

C# ってオーバーロードができるのにデフォルト値まであります

class C
{
public int method(int a, int b = 0) {}
public int method(int a) {}
}

なのでこんなこともできます

引数ひとつで呼び出したらどっちが実行されるのだろうと思って試してみたら デフォルト引数ではなく 渡された引数の数と一致するほうが優先されました
そうなると引数が 2 つの方のメソッドをデフォルト値で呼び出すことが出来ません

呼び出す側でデフォルト値と同じ値を渡す方法で同じ動きには出来るものの 将来的にデフォルト値を変えるときに呼び出す側まで変えることになります

リフレクションならできないかな と引数が 2 つあるほうのメソッドを取得して引数一つで呼び出してみました

結果は エラー

無理なのかなーと調べてみたら デフォルト値を使うところに Type.Missing を渡せばいいようです

> class A { public int x(int num, int num2 = 100) { return num + num2; } public int x(int num) { return num; } }
> new A().x(10, 100)
110
> new A().x(10)
10
> var a = new A();
> var m = typeof(A).GetMethod("x", new Type[] { typeof(int), typeof(int) });
> m.Invoke(new A(), new object[] { 10 })
パラメーター カウントが一致しません。
> m.Invoke(new A(), new object[] { 10, Type.Missing })
110

これなら 直接呼び出すときに Type.Missing 渡せばいけるんじゃ?と思ったのですがそれは型が違うと言われてダメでした
Type.Missing を dynamic 型キャストしていても同じくだめです

なのでリフレクション必須です