В чем причина невозможности использовать более одного параметра params в определении метода? - PullRequest
1 голос
/ 15 сентября 2010

Что-то вроде:

public static void Estimate ( params string [ ] names, params int[] numbers )
{ }

где вы можете использовать его как:

Estimate ( "Eric", "Simpson", "Jon", 1, 2, 3, 4, 5 )

Ответы [ 2 ]

3 голосов
/ 15 сентября 2010

Томас и Кирк правы, это будет трудно решить, и даже более того, это может привести к неожиданному поведению с точки зрения разработчика, использующего его.Например, возьмите следующий класс:

public class Overload<T, U>
{
    public void SomeMethod(params T[] arrayOfT, params U[] arrayOfU) { }
}

Разрешение нескольких параметров с использованием ключевого слова 'params' в методе сделало бы эту компиляцию просто отличной и работало бы в большинстве случаев, пока кто-то не попытался использоватькласс как Overload<string, string> (или что-то подобное), а затем произойдет ошибка компиляции.Другая трудность заключается в том, что параметр, помеченный ключевым словом 'params', позволяет пропустить этот параметр при вызове метода.Например, следующее также невозможно адекватно разрешить, если метод вызывается без параметров или даже с несколькими значениями типа int.

void SomeOtherMethod(params string[] arrayOfString, params int[] arrayOfInt);
void SomeOtherMethod(params int[] arrayOfInt);

Обычно добавляются языковые функции, если для них есть явное преимущество,Они сделают вещи легче или просто помешают прогрессу?Это явное препятствие, и его можно обойти, если сделать, как предложил Томас, и использовать параметр params object [].Вы также можете передавать отдельные массивы (например, SomeOtherMethod (string [] arrayOfString, int [] arrayOfInt)), если вам лучше подходит разделение по типу.

1 голос
/ 15 сентября 2010

Как уже обсуждалось в комментариях - это было бы кошмаром как для авторов компиляторов, так и для авторов спецификации :-).(Разрешение перегрузки в C # уже достаточно сложно)

Одним из возможных решений, когда вам нужно что-то подобное на практике, это просто отказаться и использовать один параметр params типа object[].Это может быть не очень элегантно, но позволяет вам делать то, что вам нужно.Компилятор не будет проверять, все ли применения правильны, но это все же может быть разумным ...

Например, конструкторы типов LINQ to XML (например, XElement) обычно делают это, так что вы можете создатьXElement содержит в себе другие элементы, атрибуты, коллекции элементов и т. Д.

 new XElement( new XElement("elem"),
               new XAttribute("attr", "value"),
               GetListOfElements() );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...