Пожалуйста, объясните о делегате Func в .NET 4.0 - PullRequest
7 голосов
/ 01 ноября 2011

В .NET 4.0 есть встроенный метод делегата:

public delegate TResult Func<in T, out TResult>(T arg);

Используется в методах расширения LINQ, например:

IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

Я не совсем понимаю, что такое делегат Func, почему следующее лямбда-выражение ему соответствует:

// p is a XElement object
p=>p.Element("firstname").Value.StartsWith("Q")

Ответы [ 2 ]

12 голосов
/ 01 ноября 2011

Func<T,TResult> просто означает: метод, который принимает T в качестве параметра и возвращает TResult. Ваша лямбда соответствует этому, в том случае, если для T=XElement и TResult=bool ваша лямбда принимает T и возвращает TResult. В этом конкретном случае его обычно называют предикатом. Компилятор может вывести аргументы универсального типа (T и TResult) на основе использования во многих (не во всех) сценариях.

Обратите внимание, что in и out относятся к (co | contra) -вариантному поведению метода, а не к нормальному использованию out (то есть out здесь не имеет в виду by-ref, не предполагается, что он будет назначен при вызове, и должен быть назначен до выхода).

5 голосов
/ 01 ноября 2011

Func<T,TResult> принимает два общих параметра: T и TResult.Как видите, T - это тип параметра arg, а TResult - это тип возвращаемого значения, поэтому ваш код

// p is a XElement object
p=>p.Element("firstname").Value.StartsWith("Q")

будет действительным Func<XElement, bool>.

*.1012 * Универсальные модификаторы in и out означают, что параметры являются контравариантными или ковариантными.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...