Func <t>和Func <task <t>&gt;

时间:2017-09-30 17:26:04

标签: c# async-await ambiguous tpl-dataflow

TLDR;

Why is the first call here ambiguous?

有没有办法让我在没有创建新Func的情况下向编译器解释歧义?

使用DataFlow (TPL)时,create an ActionBlock可以{/ 3}}:

var downloadString = new TransformBlock<string, string>(uri =>
{
   Console.WriteLine("Downloading '{0}'...", uri);
   return new WebClient().DownloadString(uri);
});

TransformBlock(以及其他)包含两个构造函数,如下所示:

public TransformBlock(Func<TInput, TOutput> transform);
public TransformBlock(Func<TInput, Task<TOutput>> transform);

因此您可以创建异步块:

var downloadString = new TransformBlock<string, string>(async uri =>
{
    Console.WriteLine("Downloading '{0}'...", uri);
    return await (new WebClient().DownloadStringAsync(uri));
});

当我想将lambda移动到它自己的方法时,我有问题,即

...
var downlodString = new TransformBlock<string, string>(DownloadUriAsync);
...

private async Task<string> DownloadUriAsync(string uri){
    Console.WriteLine("Downloading '{0}'...", uri);
    return await (new WebClient().DownloadStringAsync(uri));
}
  

错误CS0121:以下方法或属性之间的调用不明确:TransformBlock<TInput, TOutput>.TransformBlock(Func<TInput, TOutput>)TransformBlock<TInput, TOutput>.TransformBlock(Func<TInput, Task<TOutput>>)

我无法理解为什么它不明确,因为我已将通用参数定义为<string, string>而非<string, Task<string>>。我可以做一个解决方法:

var downlodString = new TransformBlock<string, string>(new Func<string, Task<string>>(DownloadUriAsync));

但这对我来说有点笨拙。

重复问题:

为什么呼叫起初不明确?
有没有办法让我向编译器解释模糊性而不创建新的Func?

0 个答案:

没有答案