Params IEnumerable <T> c#

Почему наклон я использую IEnumerable с параметрическими усилителями? Это будет когда-либо фиксироваться? Я действительно желаю, чтобы они переписали бы старые библиотеки для использования дженериков...

60
задан Olly 7 March 2015 в 03:25
поделиться

3 ответа

Почему я не могу использовать iEnumerable с параматами?

Вопрос предполагает, что команда дизайна должна предоставить причина не , добавьте функцию на язык. Это предположение ложно.

Скорее, для того, чтобы функция была использована вами, она должна быть продумана, спроектирована, указана, реализована, проверена, документирована и отправлена. Все они имеют большие затраты.

Функция «Перечислимая параматов» была рассмотрена и разработана. Он никогда не был указан, реализован, проверен, документирован или отправлен.

Следовательно, вы не можете использовать функцию.


Обновление: поскольку это написание - начало 2015 года - теперь было указано, но реализация, тестирование, документация и доставка были сокращены для C # 6.0 в последней части 2014 года. См. Объявление Луцина здесь: http: //roslyn.codePlex.com/discussions/568820.

Так как он до сих пор не был реализован, проверен, задокументирован и отправлен, есть еще нет такой особенности. Надеюсь, это сделает его в гипотетической будущей версии C #.


Обновление: я должен уточнить, что я подразумеваю под «функцией», поскольку мы все можем иметь разные идеи в наших головах, что «особенность». Особенностью, о которой я говорю, - это позволить вам сказать что-то вроде

void Frob(params IEnumerable<int> x)
{
    foreach(int y in x) ...
}

, а затем сайт вызова может быть либо в «нормальной форме» передачи последовательности целых чисел, либо «расширенная форма» Frob (10, 20, 30). Если в расширенной форме компилятор генерирует вызов, как если бы вы сказали Frob (новый INT [] {10, 20, 30}), так же, как и для массивов параметра. Точка признака заключается в том, что часто бывает то, что метод никогда не использует произвольный доступ к массиву, и, следовательно, мы могли бы ослабить требование о том, что параметры являются массивом. Пармы могут просто быть последовательностью вместо этого.

Вы можете сделать это сегодня, сделав перегрузку:

void Frob(params int[] x) { Frob((IEnumerable<int>)x); }

void Frob(IEnumerable<int> x)
{
    foreach(int y in x) ...
}

, которая немного боли. Мы могли бы просто позволить вам использовать iEnumerable в качестве типа аргумента параметров и сделать с ним.

Это когда-нибудь будет исправлено?

Я надеюсь так. Эта функция в течение длительного времени была в списке. Это сделало бы много функций работать намного хорошо с LINQ.

Frob(from c in customers select c.Age);

без необходимости писать две разные версии Frob.

Тем не менее, это простое «маленькое удобство» особенность; На самом деле это не добавляет много новой мощности на язык. Вот почему его никогда не делали его достаточно высоко в списке приоритетов, чтобы сделать его в «Спецификация написана» этап.

Я действительно желаю, чтобы они переписали старые библиотеки для использования универсальных.

отметил комментарий.

96
ответ дан 24 November 2019 в 17:46
поделиться

Ах, я думаю, что я может теперь понял, что вы имеете в виду. Я думаю, что вы хотите быть в состоянии объявить такой метод:

public void Foo<T>(params IEnumerable<T> items)
{
}

, а затем сможете вызвать его с «нормальным» аргументом, таким как этот:

IEnumerable<string> existingEnumerable = ...;
Foo(existingEnumerable);

или с несколькими параметрами:

Foo("first", "second", "third");

это то, что вы после этого? (Отмечая, что вы хотите использовать первую форму, чтобы использовать T = string , а не T = iEnumerable с одним элементом ...)

Я согласен это может быть полезным , но достаточно легко иметь:

public void Foo<T>(params T[] items)
{
    Foo((IEnumerable<T>) items);
}

public void Foo<T>(IEnumerable<T> items)
{
}

Я не считаю, что я делаю это достаточно часто, чтобы сделать вышеупомянутый особенно уродливый обходной путь.

Обратите внимание, что при вызове вышеуказанного кода вы хотите явно Укажите аргумент типа, чтобы избежать компилятора Params пример. Так, например:

List<string> x = new List<string>();
Foo<string>(x);
11
ответ дан 24 November 2019 в 17:46
поделиться

Параметры параметров отправляются в соответствии с массивом, а iEnumerable не предоставляет случайного доступа, который требуется действовать как массив.

Вы должны создать массив из IENumerable, когда вы вызываете метод:

TheMethod(theIEnumerable.ToArray());
4
ответ дан 24 November 2019 в 17:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: