ライブラリ メソッドにオプションのパラメータを追加することは破壊的変更であることを承知しています。
void Foo(int x) // OLD
void Foo(int x, int y = 5) // NEW
コンパイルされたコードでは、新しいバージョンは として表示されるためFoo(int, int)
です。Foo(0)
(ソース コード)のすべての呼び出しはFoo(0, 5)
、コンパイラによって (コンパイルされたコード) に変換されます。したがって、コンパイル済みの呼び出しを使用する古いクライアントはFoo(0)
、適切なメソッドを見つけられません。
他の方向はどうですか?
void Foo(int x, int y = 5) { ... } // OLD
void Foo(int x) { Foo(x, 5); } // NEW
void Foo(int x, int y) { ... } // NEW
Foo(0)
(ソース コード) は引き続きコンパイルされ、Foo(0, 5)
(コンパイルされたコード) は適切なオーバーロードを見つけるため、理論的にはこれは機能するはずです。
それは実際に機能しますか?つまり、このシナリオは .NET ランタイムと C#/VB コンパイラによって「公式にサポートされている」のでしょうか? または、オプションのパラメーターを使用したメソッドの呼び出しが何らかの形で「マーク」されているため、オプションのパラメーターがオーバーロードに置き換えられたときに失敗しますか?
編集:明確にするために、バイナリ互換性について尋ねています:再コンパイルせずlibrary.dll (old)
に置き換えることは可能ですか?library.dll (new)
projectUsingLibrary.exe