Лямбда-выражения (как определяется функция расширения Select?) - PullRequest
2 голосов
/ 10 июля 2011
var numbers=new int[]{1,2,3};
var numbers1=numbers.Select(n=>n);
var numbers2=numbers.Select(n=>n.ToString());
var numbers3=numbers.Select(n=>new {Number=n, Even=n%2==0});

Каким образом выход функции расширения SELECT может быть любого типа?

Ответы [ 3 ]

5 голосов
/ 10 июля 2011

Это универсальный метод расширения, определенный со следующей подписью:

public static IEnumerable<Tresult> Select<TSource, TResult>(
                this IEnumerable<TSource> source, 
                Func<TSource, TResult> selector);

Имея информацию о типе, представленную в аргументе source и selector, компилятор может вывести используемые типы, поэтому вам не нужно явно называть его.

1 голос
/ 10 июля 2011

IEnumerable.Select - это универсальный метод со следующими сигнатурами:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, TResult> selector
)

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, int, TResult> selector
)

Переданная функция должна возвращать TResult и Selectсам возвращает IEnumerable<TResult>.Тип TResult может быть выведен компилятором (как сделано в посте), или он может быть явно аннотирован.

Больше информации о дженериках - как TResult может быть "произвольным, но частнымtype ", например - можно найти в Руководстве по программированию C # Generics .Существует ряд вопросов SO, в которых обсуждаются также ограничения вывода типа C # (включая обобщение).

Счастливое кодирование.

1 голос
/ 10 июля 2011

Для конкретной версии Select здесь используется селектор Func<T, TResult>, где T - это тип входа (в данном случае int), а TResult - это выход. Основываясь на вашем лямбда-выражении, компилятор может вывести типы TResult. В вашем случае, типы

  • INT
  • строка
  • Anonymous

Если вам интересны такие анонимные функции, я рекомендую вам ознакомиться со спецификацией C # 4.0 , возможно, начиная с раздела 7.15.

...