У меня есть метод, как это:Как обеспечить ошибку компиляции на изменение подписи, в которой используется ключевое слово «Params»
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
живет в сборке, совместно используемой многими проектами, автоматически создаваемыми на сервере сборки. Таким образом, ошибка компиляции будет простым способом обнаружить весь код, который необходимо затронуть, чтобы внести изменения.)
Редактировать: Как указал Даниэль Манн и другие, приведенный выше пример предполагает, что я не должен использовать параметры вообще. Поэтому я должен объяснить, что в моем реальном мире не всегда так, что 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]);
}
}
Почему бы не изменить подпись, чтобы сделать что-то совершенно другое (хотел взять 'int' или что-то). Тогда во всех методах будет выбрана ошибка компиляции? Конечно, лучший способ - рефакторинг с помощью Resharper или аналогичный. –
Чтобы добавить к @dav_i: если вы _first_ добавляете 'int' вместо' string', компилируете, изменяете весь код вызова, а затем меняете 'int' на' string'. Также обратите внимание, что 'if (« do bar ».Equals (baz)) {' - очень плохой пример, это звучит как другая перегрузка или требуется больше рефакторинга. – CodeCaster
Сделайте то, что предлагает @OndrejJanacek. Это ___definitely___ лучший способ. –