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

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

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

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

2017-10-16 240
Выведенный тип возвращаемого значения 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, которые являются результатом вывода типа.


Поделиться с друзьями:

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

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

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.007 с.