私はこのような方法を持っています:
public void Foo(params string[] args) {
bar(args[0]);
bar(args[1]);
}
新しい要件により、次のような変更が行われます。
public void Foo(string baz, params string[] args) {
if("do bar".Equals(baz)) {
bar(args[0]);
bar(args[1]);
}
}
Foo
問題は、メソッド シグネチャを変更してもコンパイル エラーが発生しないことです。これはもちろん正しいのですが、引数が指定されていないメソッドを呼び出すたびにコンパイル エラーが発生するようにしたいと考えbaz
ています。つまりFoo
、変更前の呼び出しが次の場合:
Foo(p1,p2); //where p1 and p2 are strings
それは今これである必要があります:
Foo(baz,p1,p2);
このように変更されない場合は、p1
に割り当てられbaz
、params 配列args
の長さは 1 になり、OutOfBounds
例外がスローされます。
署名を変更し、すべての呼び出しコードがそれに応じて更新されるようにする最善の方法は何ですか? (実際のシナリオはFoo
、ビルド サーバー上で自動的にビルドされた多くのプロジェクトによって共有されるアセンブリに存在する場所です。したがって、コンパイル エラーは、変更に対応するために変更する必要があるすべてのコードを検出する簡単な方法です。)
編集: Daniel Mann と他の人が指摘したように、上記の例は、params をまったく使用しないことを示唆しています。したがって、実世界の例では、Foo のロジックに関する限り、args に 2 つの要素が必要であるとは限らないことを説明する必要があります。args には任意の数の要素を含めることができます。これが Foo だとしましょう:
public void Foo(string baz, params string[] args) {
if("do bar".Equals(baz)) {
int x = GetANumberDynamically();
for(int i = 0; i<x; i++)
bar(args[i]);
}
}