【发布时间】:2015-08-13 17:29:13
【问题描述】:
希望有人可以向我解释这一点。抱歉,如果它是重复的,解释我所看到的内容的关键字现在超出了我的范围..
这是一些编译的代码
class Program
{
static void Main(string[] args)
{
new Transformer<double, double>(Math.Sqrt);
}
}
class Transformer<Tin, Tout>
{
Func<Tin, Task<Tout>> actor;
public Transformer(Func<Tin, Tout> actor)
{
this.actor = input => Task.Run<Tout>(() => actor(input));
}
}
这是一些没有的代码
class Program
{
static void Main(string[] args)
{
new Transformer<double, double>(Math.Sqrt);
}
}
public class Transformer<Tin, Tout>
{
Func<Tin, Task<Tout>> actor;
public Transformer(Func<Tin, Tout> actor)
{
this.actor = input => Task.Run<Tout>(() => actor(input));
}
public Transformer(Func<Tin, Task<Tout>> actor)
{
this.actor = actor;
}
}
通过添加构造函数重载,这显然会产生歧义,但我不确定为什么。 Math.Sqrt 没有重载,显然返回类型为 double,而不是 Task
这是错误:
以下方法或属性之间的调用不明确:'ConsoleApplication1.Transformer
.Transformer(System.Func )' 和 'ConsoleApplication1.Transformer .Transformer(System .Func >)'
有人可以解释为什么编译器的选择不明显吗?
为关心的人提供简单的解决方法:
class Program
{
static void Main(string[] args)
{
new Transformer<double, double>(d => Math.Sqrt(d));
}
}
【问题讨论】:
-
顺便说一句,还有另一种解决方法:
new Transformer<double, double>((Func<double, double>) Math.Sqrt); -
可能是一个错误。我自己已经几次达到类型推断的极限,并且看到它与此类似地失败。我会告诉你什么是真正可怕的——你没有将你的构造函数调用链接在一起。啧啧啧。
public Transformer(Func<Tin, Tout> actor) : this(input => Task.Run<Tout>(() => actor(input)))。怀疑这会解决,但它会防止不幸的错误! -
@Will 公平评论虽然这是(显然,我希望)一个简单的复制。我实际上在 Microsoft Dataflow(msdn.microsoft.com/en-us/library/hh228603(v=vs.110).aspx) 类上看到了这种行为:TransformBlock etc...
-
参见this answer to the same issue 了解编译器需要显式键入委托的简单说明(如@Szer 建议的那样)。
标签: c#