Как выбрать тип возврата делегата asyn c - PullRequest
4 голосов
/ 25 января 2020

Я передаю asyn c делегат методу LINQ Select, и я бы предпочел получить список ValueTask s вместо списка Task s. Как мне это сделать? Пример:

var result = (new[] { 0 }).Select(async x => await Task.Yield()).ToArray();
Console.WriteLine($"Result type: {result.GetType()}");

Тип результата: System.Threading.Tasks.Task []

Это нежелательно. Я понял, что могу создать нужный список, заменив делегат asyn c на метод asyn c, например:

var result = (new[] { 0 }).Select(DoAsync).ToArray();
Console.WriteLine($"Result type: {result.GetType()}");
async ValueTask DoAsync(int arg)
{
    await Task.Yield();
}

Тип результата: System.Threading.Tasks .ValueTask []

Это работает, но неудобно. Есть ли способ сохранить аккуратный синтаксис делегата и все равно получить ValueTask s, который я хочу?

1 Ответ

5 голосов
/ 25 января 2020

Вы можете явно записать значение задачи, как это

var result = (new[] { 0 }).Select<int, ValueTask>(async x => await Task.Yield()).ToArray();
...