Как выводится лямбда-параметр? - PullRequest
0 голосов
/ 16 марта 2020

Это пример кода от Microsoft, объясняющий, как работают цепочки задач:

using System;
using System.Threading.Tasks;

1.    public class Example
2.    {
3.       public static async Task Main()
4.       {
5.          // Execute the antecedent.
6.          Task<DayOfWeek> taskA = Task.Run( () => DateTime.Today.DayOfWeek );
7.         // Execute the continuation when the antecedent finishes.
8.          await taskA.ContinueWith
9.               ( antecedent => Console.WriteLine("Today is {0}.", antecedent.Result) );
10.       }
11.    }

В строке # 9 ContinueWith передается лямбда-выражение.

Мой вопрос: как компилятор узнает, что такое antecedent и где его взять? Я имею в виду, что taskA имеет свойство Result и может быть передано в качестве аргумента, но компилятор просто go обходит код и, когда он видит первое, что может быть передано, выбирает его?

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Метод Task ContinueWith имеет определенные c перегрузки, которые определяют, какую функцию он принимает в качестве параметра, определяющего параметры функции. У вас есть много вариантов, поэтому проверьте официальную документацию для получения подробной информации.

В примере используется перегрузка ContinueWith(Action<Task<TResult>>) самая основная c, где вы можете увидеть параметр указывается в определении метода, таким образом определяется тип параметра Action. Вы вызываете ContinueWith для Task<DayOfWeek>, поэтому тип TResult равен DayOfWeek, и для этого случая выведенная сигнатура методов выглядит следующим образом ContinueWith(Action<Task<DayOfWeek>>).

0 голосов
/ 17 марта 2020

Вывод лямбда-параметра соответствует параметру antecedent параметру Task<DayOfWeek>.ContinueWith(Action<System.Threading.Tasks.Task<DayOfWeek>> continuationAction) continuationAction, и поэтому для типа antecedent устанавливается Task<DayOfWeek>.

ContinueWith передает завершенный Task<DayOfWeek> taskA в качестве параметра лямбды, потому что это то, для чего он определен: см. документацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...