Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Топ:
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Интересное:
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Дисциплины:
2017-10-16 | 239 |
5.00
из
|
Заказать работу |
|
|
Выведенный тип возвращаемого значения анонимной функции F используется при выводе типа и разрешении перегрузки. Выведенный тип возвращаемого значения можно определить только для анонимной функции со всеми известными типами параметров, которые либо заданы явно и переданы через преобразование анонимной функции, либо выведены во время вывода типа для включающего вызова универсального метода.
Выведенный тип возвращаемого значения определяется следующим образом.
· Если телом F является выражение, имеющее тип, то результирующий выведенный тип F совпадет с типом этого выражения.
· Если телом F является блок, а самым подходящим общим типом для набора выражений в операторах return блока является T (§7.5.2.14), то выведенным типом результата F будет T.
· Иначе тип результата для F вывести нельзя.
Выведенный тип возвращаемого значения определяется следующим образом.
· Если F — асинхронная функция и тело F — выражение, классифицированное как Nothing (§7.1), или блок операторов, в котором операторы return не имеют выражений, выведенным типом возвращаемого значения является System.Threading.Tasks.Task
· Если функция F является синхронной и имеет выведенный тип возвращаемого значения T, выведенным типом возвращаемого значения будет System.Threading.Tasks.Task<T>.
· Если функция F не является синхронной и имеет выведенный тип возвращаемого значения T, выведенным типом возвращаемого значения будет T.
· Иначе тип возвращаемого значения для F вывести нельзя.
В качестве примера вывода типа, включающего анонимную функцию, рассмотрим метод расширения Select, объявленный в классе System.Linq.Enumerable:
namespace System.Linq
{
public static class Enumerable
{
public static IEnumerable<TResult> Select<TSource,TResult>(
this IEnumerable<TSource> source,
Func<TSource,TResult> selector)
{
foreach (TSource element in source) yield return selector(element);
}
}
}
|
Предположим, что пространство имен System.Linq было импортировано с помощью предложения using и свойство Name класса Customer имеет тип string. Тогда для выбора имен списка клиентов можно использовать метод Select:
List<Customer> customers = GetCustomerList();
IEnumerable<string> names = customers.Select(c => c.Name);
Вызов метода расширения (§7.6.5.2) для Select обрабатывается путем перезаписи вызова статического метода:
IEnumerable<string> names = Enumerable.Select(customers, c => c.Name);
Поскольку аргументы типа не были указаны явно, для получения аргументов типа используется вывод типа. Сначала аргумент customers связывается с параметром source, и для T выводится тип Customer. Затем, используя описанный выше процесс вывода типа анонимной функции, c присваивается тип Customer, а выражение c.Name связывается с типом возвращаемого значения параметра selector, в результате чего для S выводится тип string. Таким образом, этот вызов эквивалентен
Sequence.Select<Customer,string>(customers, (Customer c) => c.Name)
а результат имеет тип IEnumerable<string>.
В следующем примере демонстрируется, как вывод типа анонимной функции обеспечивает «перетекание» данных о типе между аргументами в вызове универсального метода. Если имеется метод:
static Z F<X,Y,Z>(X value, Func<X,Y> f1, Func<Y,Z> f2) {
return f2(f1(value));
}
Вывод типа при вызове:
double seconds = F("1:15:30", s => TimeSpan.Parse(s), t => t.TotalSeconds);
продолжается следующим образом: сначала аргумент "1:15:30" связывается с параметром value и для X выводится тип string. Затем параметру первой анонимной функции s присваивается выведенный тип string, а выражение TimeSpan.Parse(s) связывается с типом возвращаемого значения f1, в результате чего для Y выводится тип System.TimeSpan. И наконец, параметру второй анонимной функции t присваивается выведенный тип System.TimeSpan, а выражение t.TotalSeconds связывается с типом возвращаемого значения f2, в результате чего для Z выводится тип double. Таким образом, результат вызова имеет тип double.
7.5.2.13 Вывод типа при преобразовании групп методов
Аналогично вызовам универсальных методов вывод типа также должен применяться, когда группа методов M, включающая универсальный метод, преобразуется в данный тип делегата D (§6.6). Если имеется метод
|
Tr M<X1…Xn>(T1 x1 … Tm xm)
и группа методов M назначается типу делегата D, то задачей вывода типа является поиск аргументов типа S1…Sn, чтобы выражение:
M<S1…Sn>
оказалось совместимым (§15.1) с D.
В отличие от алгоритма вывода для вызовов универсальных методов, в данном случае имеются только типы аргументов, но не выражения аргументов. В частности, нет анонимных функций, следовательно, нет необходимости в нескольких этапах вывода.
Вместо этого все Xi считаются нефиксированными, и выполняется вывод по нижней границе из каждого типа аргумента Uj для D в соответствующий тип параметра Tj для M. Если для какого-либо Xi границы не были найдены, вывод типа завершается сбоем. Иначе все Xi фиксируются в соответствующие Si, которые являются результатом вывода типа.
|
|
Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!