Выведенный тип возвращаемого значения — КиберПедия 

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Выведенный тип возвращаемого значения

2017-10-16 239
Выведенный тип возвращаемого значения 0.00 из 5.00 0 оценок
Заказать работу

Выведенный тип возвращаемого значения анонимной функции 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.009 с.