我有这样的方法:
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。所以我应该解释一下,在我的真实示例中,args 并不总是需要有两个元素,就 Foo 中的逻辑而言,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]);
}
}